2011-10-26 35 views
4

我使用VideoView播放視頻文件。我正在使用seekTo功能來播放已停播的視頻。但是,當查找操作完成時,我想做一些操作。爲此,我需要使用onSeekCompleteListener;但是,VideoSelect不支持onSeekCompleteListener;它可以與MediaPlayer一起使用。我的問題是「有什麼方法可以使用onSeekCompleteListener」與VideoView?安卓:onSeekCompleteListener與VideoView

非常感謝

+0

我有同樣的問題,如果你有解決你的問題 - 我會很高興到這裏是什麼答案.. –

+0

不幸的是,onSeekCompleteListener不能用於VideoView。我也不明白爲什麼這不支持VideoView,如果它支持seekTo操作。此處的解決方案是使用MediaPlayer而不是VideoView,因爲onSeekCompleteListener可用於MediaPlayer。您可以使用MediaPlayer而不是VideoView獲得相同的功能。希望這可以幫助你.. – Farhan

+0

感謝您的回答,但 - 我不得不說,我發現更好,更簡單的解決方案,因爲我正在寫回答您的原始問題。看看我的自定義類擴展VideoView –

回答

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); 
} 

}

可以偵聽這樣的事件:

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

爾漢,你是正確的,onSeekCompleteListener不VideoView支持。

但是你可以複製和本地定製VideoView類將自己添加這種支持。

我展示瞭如何在my answer to 7990784做到這一點。

17

沒有必要創建一個自定義VideoView

您可以從VideoViewonPrepared方法訪問MediaPlayer,然後設置OnSeekCompleteListener,就像這樣:

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

沒有爲我工作。使用'videoView.seekTo()'後沒有事件被觸發 – Gibberish

+0

@Gibberish請張貼一些代碼,以便我們可以幫助您 –

+0

我設法弄明白。這有效,但對我來說沒有幫助。根據視頻編碼的不同,您無法找到您想要的位置,例如h.264 – Gibberish