gpt4 book ai didi

android - 在某些情况下无法从外部设置 videoview 的 mediaPlayer 的音量

转载 作者:搜寻专家 更新时间:2023-11-01 09:40:07 25 4
gpt4 key购买 nike

我需要在 onPrepared 方法之外动态改变 videoView 的音量。因此,我保存了对 videoView 媒体播放器的引用,我正在其上使用 setVolume 方法。

private MediaPlayer videoViewMediaPlayer;

videoView onPreparedListener:

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

现在,每当我需要调整 mediaPlayer 的音量时,我都会使用:

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)
  1. 出现此异常的原因是什么?
  2. 如果调用 onPrepared 时 videoView 不可见,setVolume(0, 0) 会将 videoView 设置为静音吗?
  3. 如何在 onPrepared(...) 方法之外设置音量?

最佳答案

回答您的问题可能会晚一些,但回答这个问题是为了防止将来其他人无意中发现这个话题。

我在尝试为基于 VideoView 的 MediaPlayer 设置音量时遇到了类似的问题,因为我在 MediaPlayer 重置后立即调用了 mediaPlayer.setVolume() 方法。重要的是检查您的代码,您在哪里调用 setVolumeForMediaPlayer(videoViewMediaPlayer) 方法。

根据 MediaPlayer State-Diagram docs ,

There is a subtle but important difference between a newly constructed MediaPlayer object and the MediaPlayer object after reset() is called. It is a programming error to invoke methods setLooping(boolean), setVolume(float, float) in the Idle state for both the cases. If any of these methods is called right after a MediaPlayer object is constructed, the user supplied callback method OnErrorListener.onError() won't be called by the internal player engine and the object state remains unchanged; but if these methods are called right after reset(), the user supplied callback method OnErrorListener.onError() will be invoked by the internal player engine and the object will be transfered to the Error state.

回答您的问题:

  1. 发生此异常是因为在设置音量时,您的 mediaPlayer 尚未处于 PREPARED 状态,调用它们会导致其滑入 ERROR 状态。一种可能的解决方案是仅在准备好 View 或任何后续状态时设置音量。

  2. 是的。鉴于该状态它不处于上述 ERROR 状态。

  3. 我建议您在跟踪状态后谨慎调用该方法。例如,您可以在 setVolumeForMediaPlayer(videoViewMediaPlayer) 方法中检查 isPlaying() 或 isPaused() 状态。

PS:另一方面,我想知道当您在其他任何地方都使用 mediaPlayer 参数时,为什么要在 onPrepared 调用中初始化 videoViewMediaPlayer。这种初始化看起来很安全,但却是多余的。

关于android - 在某些情况下无法从外部设置 videoview 的 mediaPlayer 的音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40375880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com