我们正在尝试使用 aVideoView
在 Android Activiy 中播放视频。
我已经阅读了 MediaPlayer 文档并研究了它的状态图。
如果我们调用这个方法,我们会得到一个媒体播放器错误:
从这个监听器方法:
MediaPlayer.OnPreparedListener.onPrepared()
来自 LogCat 的错误消息:
error (-38, 0)
笔记:
我们已经在两个物理设备上进行了测试,并且这只发生在我们的摩托罗拉 Xoom 上。
如果我注释掉这一行:mp.setLooping(false);
Xoom 上一切正常。
(见下面的代码)
根据文档,setLooping()
可以从以下媒体播放器状态调用:
- 闲置的
- 初始化
- 停止
- 准备好的
- 开始
- 暂停
- 播放完成
尽管文档还包含这个看似矛盾的陈述:
调用 getCurrentPosition()、getDuration()、getVideoHeight()、getVideoWidth()、setAudioStreamType(int)、setLooping(boolean)、setVolume(float, float)、pause()、start() 等方法是编程错误、stop()、seekTo(int)、prepare() 或 prepareAsync() 处于空闲状态...
问题一:
为什么我们不能调用setLooping()
from onPrepared()
?
问题2:
VideoView 不应该处理底层 MediaPlayer 的准备工作吗?
问题 3:
调用时MediaPlayer 不应该处于准备状态吗?onPrepared()
问题4:
如何解决文档中似乎相互矛盾的陈述?
真正让我困惑的是:
上面的引用说,当 MediaPlayer 处于空闲状态时,不应调用这些方法:
- 获取当前位置()
- 获取持续时间()
- 获取视频高度()
- 获取视频宽度()
- setAudioStreamType(int)
- 设置循环(布尔值)
- 设置音量(浮动
- 漂浮)
- 暂停()
- 开始()
- 停止()
- 寻求(整数)
- 准备()
- 准备异步()
这个声明(连同我们的错误消息)让我认为我们的错误发生是因为 MediaPlayer 没有成功准备好。
但是,由于某种原因,调用setAudioStreamType()
.
问题 5:
为什么有问题setLooping()
但没有问题setAudioStreamType()
?
这两种方法都在上面的禁止方法列表中。
(也就是说,我认为两者在方法中都是有效的onPrepared()
......)
我错过了什么?
摩托罗拉 Xoom 有问题吗?
我很高兴能得到问题 1 的答案,但我真的对这一切感到困惑。
我承认我对 Android 开发很陌生...
我们的 Xoom 正在运行 Ice Cream Sandwich 4.0.4。
这是一些示例代码:
class VideoActivity {
VideoView mVidView;
@Override
protected void onCreate(Bundle b) {
mVidView = new VideoView(this);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(mWidth, mHeight);
mVidView.setLayoutParams(params);
mVidView.setVideoURI(mUri);
mVidView.setZOrderOnTop(true);
mMediaController = new MediaController(this, true);
mMediaController.setAnchorView(null);
mVidView.setMediaController(mMediaController);
mVidView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
public boolean onError(MediaPlayer mp, int what, int extra) {
.
.
.
}
});
mVidView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
.
.
.
}
});
mVidView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
mDialog.dismiss();
mMediaPlayer = mp;
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setLooping(false);
mp.setScreenOnWhilePlaying(true);
mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
public void onSeekComplete(MediaPlayer mp) {
mp.start();
}
});
if (mTimecode > 0) {
mp.seekTo(mTimecode * ONE_SEC);
} else {
mp.start();
}
mMediaController.show(0);
}
});
LinearLayout ll = (LinearLayout) this.findViewById(R.id.parentpopup);
ll.addView(mVidView);
}
}