ton*_*nyc 15 android media-player android-videoview
有谁知道是否有可能检测到VideoView何时缓冲?
我想在视频缓冲时显示ProgressDialog.
到目前为止,我尝试使用OnPreparedListener,但这仅在首次加载视频时才有效.如果正在播放视频并且用户将擦洗条移动到不同的点,则视频仍然"准备好",即使它正在缓冲.
我也试过(我知道这很糟糕)AsyncThread只是忙等待isPlaying():
private class BufferTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void...voids) {
final VideoView videoView = (VideoView)findViewById(R.id.video);
while (!videoView.isPlaying()) { }
return null;
}
protected void onPostExecute(Void v) {
// Hide the dialog here...
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为只要你调用start(),即使它正在缓冲,VideoView似乎也被认为是在播放.
我能想到的唯一解决方案是构建一个自定义的VideoView类型类,以便我可以访问它的MediaPlayer实例.
有任何想法吗?谢谢阅读.
cad*_*rry 13
从API级别17开始,您现在可以从MediaPlayer访问InfoListener:
final MediaPlayer.OnInfoListener onInfoToPlayStateListener = new MediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START: {
mProgressBar.setVisibility(View.GONE);
return true;
}
case MediaPlayer.MEDIA_INFO_BUFFERING_START: {
mProgressBar.setVisibility(View.VISIBLE);
return true;
}
case MediaPlayer.MEDIA_INFO_BUFFERING_END: {
mProgressBar.setVisibility(View.VISIBLE);
return true;
}
}
return false;
}
});
mVideoView.setOnInfoListener(onInfoToPlayStateListener);
Run Code Online (Sandbox Code Playgroud)
mig*_*las 10
我带来了以下hack,以便不实现自定义VideoView.如果当前位置与之前的1秒相同,则每1秒检查一次.如果是,则视频正在缓冲.如果没有,视频真的在播放.
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
public void run() {
int duration = videoView.getCurrentPosition();
if (old_duration == duration && videoView.isPlaying()) {
videoMessage.setVisibility(View.VISIBLE);
} else {
videoMessage.setVisibility(View.GONE);
}
old_duration = duration;
handler.postDelayed(runnable, 1000);
}
};
handler.postDelayed(runnable, 0);
Run Code Online (Sandbox Code Playgroud)
videoMessage只是一个TextView,文本"Buffering ..."放在我的VideoView的中心.
| 归档时间: |
|
| 查看次数: |
14618 次 |
| 最近记录: |