我需要在videoView方法之外动态改变onPrepared的体积。所以我保存了对videoView的媒体播放器的引用,我正在使用setVolume方法。

private MediaPlayer videoViewMediaPlayer;

准备侦听器上的视频视图:
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        videoViewMediaPlayer = mediaPlayer;
        setVolumeForMediaPlayer(mediaPlayer);
        videoView.setBackgroundColor(Color.TRANSPARENT);
        mediaPlayer.setLooping(false);
    }
});

...
private void setVolumeForMediaPlayer(MediaPlayer mediaPlayer) {
    if (mediaPlayer != null) {
        if (muteAudio)
            mediaPlayer.setVolume(0, 0);
        else
            mediaPlayer.setVolume(1.0f, 1.0f);
    }
}

现在,每当我需要调整媒体播放器的音量时,我都会使用:
setVolumeForMediaPlayer(videoViewMediaPlayer);

但是,引发了以下异常:
java.lang.IllegalStateException
    at android.media.MediaPlayer._setVolume(Native Method)
    at android.media.MediaPlayer.setVolume(MediaPlayer.java:1604)
    at com.blynq.app.fragments.PlayerPane.setVolumeForMediaPlayer(PlayerPane.java:501)
    at com.blynq.app.fragments.PlayerPane.changeActiveMedia(PlayerPane.java:408)
    at com.blynq.app.asyncs.PanePlayerAsyncTask.onProgressUpdate(PanePlayerAsyncTask.java:130)
    at com.blynq.app.asyncs.PanePlayerAsyncTask.onProgressUpdate(PanePlayerAsyncTask.java:22)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:656)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5343)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

出现这种异常的原因是什么?
如果调用onprepared时videoview不可见,是否会将videoview设置为静音?
如何在onprepared(…)方法之外设置卷?

最佳答案

回答你的问题可能会很晚,但回答这个问题是为了防止将来有人发现这个线索。
我在尝试为基于VideoView的MediaPlayer设置音量时遇到了类似的问题,因为我正在重置MediaPlayer之后调用mediaPlayer.setVolume()方法。在所有调用setVolumeFormeDiaplayer(VideoViewMediaPlayer)方法的代码中签入代码是很重要的。
根据mediaplayerState-Diagram docs
调用reset()后,新构造的mediaplayer对象和mediaplayer对象之间有一个微妙但重要的区别。对于这两种情况,在空闲状态下调用方法setlooping(boolean)、setvolume(float、float)是一个编程错误。如果在构造MediaPlayer对象之后调用了这些方法中的任何一个,则内部播放器引擎不会调用用户提供的回调方法onerrorListener.onerror(),并且对象状态保持不变;但如果在reset()之后调用了这些方法,则用户提供的回调方法onerrorListener.onerror()将由内部播放器引擎调用,对象将被传输到错误状态。
回答你的问题:
此异常正在发生,因为在设置卷时,您的子项尚未处于准备状态,调用它们会使其滑向错误状态。一个可能的解决方案是,只有在视图准备好或以后的任何状态下才能设置音量。
对。假设状态不是上述的错误状态。
我建议你在跟踪状态后仔细调用该方法。例如,可以检查setVolumeFormeDiaplayer(VideoViewMediaPlayer)方法中的isPlay()或isPaused()状态。
注:另一方面,我想知道当您在其他地方使用mediaplayer参数时,为什么要在onprepared调用中初始化videoviewmediaplayer。初始化看起来是安全的,但却是多余的。

09-10 01:59
查看更多