2011-10-26 4 views
4

J'utilise VideoView pour lire des fichiers vidéo. J'utilise la fonction seekTo pour lire la vidéo d'où elle a été laissée. Cependant, je voulais faire quelques opérations lorsque l'opération de recherche est terminée. Pour cela, j'ai besoin d'utiliser onSeekCompleteListener; cependant, onSeekCompleteListener n'est pas pris en charge avec VideoView; il peut être utilisé avec MediaPlayer. Ma question est: "Y at-il un moyen par lequel je peux utiliser onSeekCompleteListener" avec VideoView?android: onSeekCompleteListener avec VideoView

Merci beaucoup

+0

j'ai le même problème, si vous avez la solution à votre question - je serai heureux ici, quelle est la réponse .. –

+0

Malheureusement, onSeekCompleteListener ne peut pas être utilisé avec VideoView. Je ne comprends pas non plus pourquoi cela n'est pas supporté par VideoView s'il supporte l'opération seekTo. La solution ici est d'utiliser MediaPlayer au lieu de VideoView, car onSeekCompleteListener est disponible pour MediaPlayer. Vous pouvez obtenir la même fonctionnalité en utilisant MediaPlayer au lieu de VideoView. J'espère que cela vous aide .. – Farhan

+0

merci pour votre réponse, mais - je dois dire que j'ai trouvé une solution beaucoup mieux et plus simple que j'écris comme réponse à votre question initiale. Jetez un oeil à ma classe personnalisée qui étend VideoView –

Répondre

9
public class ObservableVideoView extends VideoView 
{ 

private IVideoViewActionListener mVideoViewListener; 
private boolean mIsOnPauseMode = false; 

public interface IVideoViewActionListener 
{ 
    void onPause(); 
    void onResume(); 
    void onTimeBarSeekChanged(int currentTime); 
} 

public void setVideoViewListener(IVideoViewActionListener listener) 
{ 
    mVideoViewListener = listener; 
} 

@Override 
public void pause() 
{ 
    super.pause(); 

    if (mVideoViewListener != null) 
    { 
     mVideoViewListener.onPause(); 
    } 

    mIsOnPauseMode = true; 
} 

@Override 
public void start() 
{ 
    super.start(); 

    if (mIsOnPauseMode) 
    { 
     if (mVideoViewListener != null) 
     { 
      mVideoViewListener.onResume(); 
     } 

     mIsOnPauseMode = false; 
    } 
} 

@Override 
public void seekTo(int msec) 
{ 
    super.seekTo(msec); 

    if (mVideoViewListener != null) 
    { 
     mVideoViewListener.onTimeBarSeekChanged(msec); 
    } 
} 

public ObservableVideoView(Context context, AttributeSet attrs) 
{ 
    super(context, attrs); 
} 

public ObservableVideoView(Context context) 
{ 
    super(context); 
} 

public ObservableVideoView(Context context, AttributeSet attrs, int defStyle) 
{ 
    super(context, attrs, defStyle); 
} 

}

vous pouvez écouter des événements comme celui-ci:

public class VideoPlayerActivity extends Activity 
{ 
public static final String VIDEO_URL = "VideoUrl"; 
private String path = ""; 
private ObservableVideoView mVideoView; 

@Override 
public void onCreate(Bundle icicle) 
{ 
    super.onCreate(icicle); 
    setContentView(R.layout.video_player_activity_layout); 
    mVideoView = (ObservableVideoView) findViewById(R.id.videoView1); 
    mVideoView.setMediaController(new MediaController(this)); 
    mVideoView.setVideoViewListener(mVideoViewListener); 


    path = getIntent().getStringExtra(VIDEO_URL);  
    if (path == "") 
    { 
     Toast.makeText(this, "Please edit VideoViewDemo Activity, and set path" + " variable to your media file URL/path", Toast.LENGTH_LONG) 
       .show(); 
    } 
    else 
    { 
     mVideoView.setVideoPath(path); 
     mVideoView.requestFocus(); 
     mVideoView.start(); 
    } 
} 

private IVideoViewActionListener mVideoViewListener = new IVideoViewActionListener() 
{ 
    @Override 
    public void onTimeBarSeekChanged(int currentTime) 
    { 
     //TODO what you want 
    } 

    @Override 
    public void onResume() 
    { 
     //TODO what you want 
    } 

    @Override 
    public void onPause() 
    { 
     //TODO what you want 
    } 
}; 

}

1

Farhan, vous avez raison, onSeekCompleteListener n'est pas pris en charge par VideoView .

Mais vous pouvez copier et personnaliser localement la classe VideoView pour ajouter ce support vous-même. Je montre comment faire cela dans my answer to 7990784.

17

Il n'est pas nécessaire de créer un VideoView personnalisé.

Vous pouvez accéder à la MediaPlayer de la méthode onPrepared du VideoView puis définissez la OnSeekCompleteListener, comme ceci:

mVideoView.setOnPreparedListener(new OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 

     mp.setOnSeekCompleteListener(new OnSeekCompleteListener() { 
      @Override 
      public void onSeekComplete(MediaPlayer mp) { 
       //TODO: Your code here 
      } 
     }); 

    } 
}); 
+1

n'a pas fonctionné pour moi. après l'utilisation de 'videoView.seekTo()' aucun événement n'a été déclenché – Gibberish

+0

@Gibberish s'il vous plaît poster du code afin que nous puissions vous aider –

+0

J'ai réussi à comprendre. Cela fonctionne, mais cela n'a pas aidé dans mon cas. Selon le codage vidéo, vous ne pouvez pas chercher où vous voulez, par exemple h.264 – Gibberish