android - 活动恢复后,Android MediaPlayer 类抛出 java.lang.IllegalStateException
问题描述
我试图在活动 onPause() 和 onResume() 方法中使用 MediaPlayer 暂停和恢复 VideoView,但在 onResume() 方法中 MediaPlayer 抛出 java.lang.IllegalStateException。我没有释放 MediaPlayer,但我认为 MediaPlayer 在活动暂停后自动释放。我应该如何处理?
private MediaPlayer mediaPlayer;
void prepareVideo() {
videoView = new VideoView(context.getApplicationContext());
String path = "android.resource://" + getPackageName() + "/" +
R.raw.my_video;
videoView.setVideoPath(path);
}
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer = mp;
mediaPlayer.start();
}
});
@Override
protected void onResume() {
super.onResume();
if (mediaPlayer != null) {
mediaPlayer.start();
}
}
@Override
protected void onPause() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
super.onPause();
}
例外:
Caused by: java.lang.IllegalStateException
at android.media.MediaPlayer._start(Native Method)
at android.media.MediaPlayer.start(MediaPlayer.java:1194)
at co.myapp.app.reborn.myappTestActivity.onResume(myappTestActivity.java:370)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1259)
at android.app.Activity.performResume(Activity.java:6347)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3110)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3152)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1400)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5530)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:734)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
解决方案
看一下android文档上的媒体播放器状态图
根据图表,您必须在调用 start() 之前调用 setDataSource() 和 prepare()。
可能之前发生了一些错误。您的 logcat 应该为您指明正确的方向。
我的猜测是您的媒体播放器不是处于暂停状态而是处于停止状态。所以你必须调用prepare然后开始,而不仅仅是开始。
不幸的是,这样您的播放将从头开始。
您可以使用 seek 命令恢复活动暂停期间保存的位置。
推荐阅读
- swiftui - SwiftUI:有人可以帮助提供包含导航视图、顶部搜索栏、项目列表和导航链接的代码吗
- html - 无法分配给“fromDate”,因为它是只读属性。ts
- c++ - 函数对象上使用的 noexcept 运算符总是产生 true
- r - 在 R 中,如何访问除 Google Drive 中特定文件类型之外的所有文件?
- python-3.x - 从 python 设置和访问 linux 中的环境变量
- php - Nginx 中的 PHP 被下载而不是渲染?
- substrate - Substrate 如何通过已知地址初始化 AccountId 变量
- c# - 如何使用 IConfidentialClientApplication 获取安全 Web API 的令牌
- generative-adversarial-network - CycleGAN 中的 2 个鉴别器?
- android - 如何检测 NestedScrollView 何时到达底部?