我们正在尝试使用VideoView
在Android Activiy中播放视频。
我已阅读MediaPlayer文档并研究其状态图。
如果我们调用此方法,我们会收到Media Player错误:
来自这个监听器方法:
MediaPlayer.OnPreparedListener.onPrepared()
来自LogCat的错误消息:
error (-38, 0)
注意:
我们已经在两台物理设备上进行了测试,而仅在我们的Motorola Xoom上进行测试。
如果我注释掉这一行:mp.setLooping(false);
Xoom上的一切正常。
(见下面的代码)
根据the documentation,可以从以下媒体播放器状态调用setLooping()
:
虽然the documentation也包括这个看似矛盾的陈述:
调用getCurrentPosition(),getDuration(),getVideoHeight(),getVideoWidth(),setAudioStreamType(int),setLooping(boolean),setVolume(float,float),pause()等方法是一个编程错误,处于空闲状态的start(),stop(),seekTo(int),prepare()或prepareAsync()......
问题1:
为什么我们不能从setLooping()
致电onPrepared()
?
问题2:
VideoView不应该处理底层MediaPlayer的准备工作吗?
问题3:
调用onPrepared()
时,MediaPlayer不应处于准备状态吗?
问题4:
如何解决文档中似乎相互矛盾的陈述?
让我感到困惑的是:
上面引用的说法当MediaPlayer处于 idle 状态时,不应该调用这些方法:
此声明(连同我们的错误消息)让我觉得我们的错误发生是因为尚未成功准备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);
}
}