1

我们正在尝试使用 aVideoView在 Android Activiy 中播放视频。

我已经阅读了 MediaPlayer 文档并研究了它的状态图。

如果我们调用这个方法,我们会得到一个媒体播放器错误:

MediaPlayer.setLooping()

从这个监听器方法:

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

0 回答 0