- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我需要在 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)
setVolume(0, 0)
会将 videoView 设置为静音吗?最佳答案
回答您的问题可能会晚一些,但回答这个问题是为了防止将来其他人无意中发现这个话题。
我在尝试为基于 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.
回答您的问题:
发生此异常是因为在设置音量时,您的 mediaPlayer 尚未处于 PREPARED 状态,调用它们会导致其滑入 ERROR 状态。一种可能的解决方案是仅在准备好 View 或任何后续状态时设置音量。
是的。鉴于该状态它不处于上述 ERROR 状态。
我建议您在跟踪状态后谨慎调用该方法。例如,您可以在 setVolumeForMediaPlayer(videoViewMediaPlayer) 方法中检查 isPlaying() 或 isPaused() 状态。
PS:另一方面,我想知道当您在其他任何地方都使用 mediaPlayer 参数时,为什么要在 onPrepared 调用中初始化 videoViewMediaPlayer。这种初始化看起来很安全,但却是多余的。
关于android - 在某些情况下无法从外部设置 videoview 的 mediaPlayer 的音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40375880/
我需要为打开的 xlsx 文件取消隐藏工作表 TAB,为此,我使用 VBS 文件打开 xlsm 文件并激活宏(位于模块中)。 当我手动运行宏时,它可以工作。 当它通过vbs激活时,它只能看到包含宏的x
我正在使用 Google Cloud Compute Engine 安装气流并使其保持正常运行。安装很好,现在它在主机上运行:0.0.0.0:8080 我有此 VM 实例的外部 IP 地址,但是我无法
我们可以在 GWT 中使用这个 $entry 方法来允许外部 javascript 执行 java 方法。 你可以在他们的文档 https://developers.google.com/web-to
在 Cython 的“Hello World”和 C 数学库中调用函数的示例之后 here ,我真正想做的是将我自己的 C 代码放在一个单独的文件中,并在 Cython 中使用它。关注 this ,我
我一直在试验 JSON Pointers引用和重用 JSON schemas . 按照示例,我能够引用在另一个 JSON 模式中声明的特定属性,一切都按预期进行,但是我还没有找到一种方法来扩展基本 J
我正在使用 X.jar 并添加到我的 AspectJ 项目(在 eclipse 中)。我已经为 X.jar 中的 myMethod() 方法编写了切入点和建议。 但是aspectj 并没有拦截这个方法
我正在 Controller 中创建一个自定义指令,并在 ng-repeat 中调用它,如下所示: HTML: JS: 在测试指令中,我按如下方式调用 loadDat
我正在尝试加载服务器上本地存在的 HTML 页面,位于名为 HTML-FIles 的文件夹中。 我想使用 jquery 加载一个文件并将其内容显示在 div 中。 现在,我可以加载文件,但在 div
我正在尝试根据初始选择从 JSON 文件生成选择菜单。我见过很多不同的方式,人们为此编写了一个函数,但想要一些非常简单的东西。 HTML: Please select Practis
我的目标是从 HTML 文档中获取文本,该文档不会调用 .jsp 文件中的任何函数。 我环顾四周,我以为我已经找到了问题的答案,但它似乎不起作用,其他答案包括使用 jQuery(我既不熟悉也不允许使用
我正在尝试从外部 JSON 文件获取文件内容,但我一直在警报中收到 null。 JS: function getText() { var result = null; var file
我正在加载一个外部 javascript 文件,该文件仅填充有 int 或字符串或 bool 值或数组的变量。类似... varBool=false; var1="var1"; var2="var2:
我的数据存储在外部 Javascript 文件中。 看起来像这样, window.videos = [{ "name": "Sample data", "duration": 154,
我有一个包含 Google ADWords 的 HTML 页面,以及来自外部 URL 的 ajax 调用,我想获取 json 来自 url 的数据。外部API也是我做的。API Controller
我试图看看是否有一种简单的方法可以通过外部 JavaScript 函数访问 Controller 的内部范围(与目标 Controller 完全无关) 我在这里看到了其他几个问题 angular.el
我尝试在运行外部命令时终止脚本,结果出现错误。考虑这个简单的代码: try { where.exe Test-App } catch { Write-Error "Exception
我在 test.js 中定义了一个外部 JS 函数 function InvokeSupport(ID, TimeStamp, Hash) { var sUrl = '' + "?uid="
如果我想将变量从外部 js 文件提取到另一个外部 js 文件。我该怎么做? 例如,如果我有一个名为 example1.js 的文件,其中包含以下代码 var test = 1; 如何获取变量 tes
我正在尝试使用 java 从外部 jar 中读取文件..例如,我有两个 jar 文件。一个是“foo.jar”,另一个是“bar.jar”。 “bar.jar”内部是文件“foo-bar.txt”。如
在我的 Java 应用程序中,我希望从未实际加载的类文件以及也未加载的 jar 文件中读取字节码内容。理想情况下,我需要能够获取任何给定的 jarfile,并找到其中的所有类。因此,考虑以下情况: 我
我是一名优秀的程序员,十分优秀!