为什么MediaPlayer.setLooping()在使用VideoView时会导致错误?

时间:2013-07-04 02:33:09

标签: java android android-mediaplayer android-videoview

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

我已阅读MediaPlayer文档并研究其状态图。

如果我们调用此方法,我们会收到Media Player错误:

MediaPlayer.setLooping()

来自这个监听器方法:

MediaPlayer.OnPreparedListener.onPrepared()

来自LogCat的错误消息:

error (-38, 0)

注意:

我们已经在两台物理设备上进行了测试,而仅在我们的Motorola Xoom上进行测试。

如果我注释掉这一行:mp.setLooping(false); Xoom上的一切正常。

(见下面的代码)

根据the documentation,可以从以下媒体播放器状态调用setLooping()

  • 空闲
  • 初始化
  • 停止
  • 制备
  • 开始
  • 暂停
  • PlaybackCompleted

虽然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 状态时,不应该调用这些方法:

  • getCurrentPosition()
  • getDuration()
  • getVideoHeight()
  • getVideoWidth()
  • setAudioStreamType(int)的
  • setLooping(布尔值)
  • setVolume(浮
  • 浮动)
  • 暂停()
  • 开始()
  • 停止()
  • seekTo(int)的
  • prepare()
  • prepareAsync()

此声明(连同我们的错误消息)让我觉得我们的错误发生是因为尚未成功准备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);
    }
}

0 个答案:

没有答案