java.lang.IllegalStateException android.media.MediaPlayer._prepare(Native Method)

2023-05-16

目录

    • 错误log:
    • 原因:

错误log:

1566550586.419 28478-28478/com.stone.stonemusic W/System.err: java.lang.IllegalStateException
1566550586.420 28478-28478/com.stone.stonemusic W/System.err: at android.media.MediaPlayer._prepare(Native Method)
1566550586.420 28478-28478/com.stone.stonemusic W/System.err: at android.media.MediaPlayer.prepare(MediaPlayer.java:1236)
1566550586.421 28478-28478/com.stone.stonemusic W/System.err: at com.stone.stonemusic.utils.playControl.MediaUtils.prepare(MediaUtils.java:43)
1566550586.421 28478-28478/com.stone.stonemusic W/System.err: at com.stone.stonemusic.utils.playControl.PlayControl.controlBtnLast(PlayControl.java:122)
1566550586.422 28478-28478/com.stone.stonemusic W/System.err: at com.stone.stonemusic.ui.activity.PlayActivity.onClick(PlayActivity.java:223)
1566550586.422 28478-28478/com.stone.stonemusic W/System.err: at android.view.View.performClick(View.java:5647)
1566550586.422 28478-28478/com.stone.stonemusic W/System.err: at android.view.View P e r f o r m C l i c k . r u n ( V i e w . j a v a : 22465 ) 1566550586.42228478 − 28478 / c o m . s t o n e . s t o n e m u s i c W / S y s t e m . e r r : a t a n d r o i d . o s . H a n d l e r . h a n d l e C a l l b a c k ( H a n d l e r . j a v a : 754 ) 1566550586.42328478 − 28478 / c o m . s t o n e . s t o n e m u s i c W / S y s t e m . e r r : a t a n d r o i d . o s . H a n d l e r . d i s p a t c h M e s s a g e ( H a n d l e r . j a v a : 95 ) 1566550586.42328478 − 28478 / c o m . s t o n e . s t o n e m u s i c W / S y s t e m . e r r : a t a n d r o i d . o s . L o o p e r . l o o p ( L o o p e r . j a v a : 163 ) 1566550586.42328478 − 28478 / c o m . s t o n e . s t o n e m u s i c W / S y s t e m . e r r : a t a n d r o i d . a p p . A c t i v i t y T h r e a d . m a i n ( A c t i v i t y T h r e a d . j a v a : 6393 ) 1566550586.42328478 − 28478 / c o m . s t o n e . s t o n e m u s i c W / S y s t e m . e r r : a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( N a t i v e M e t h o d ) 1566550586.42428478 − 28478 / c o m . s t o n e . s t o n e m u s i c W / S y s t e m . e r r : a t c o m . a n d r o i d . i n t e r n a l . o s . Z y g o t e I n i t PerformClick.run(View.java:22465) 1566550586.422 28478-28478/com.stone.stonemusic W/System.err: at android.os.Handler.handleCallback(Handler.java:754) 1566550586.423 28478-28478/com.stone.stonemusic W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95) 1566550586.423 28478-28478/com.stone.stonemusic W/System.err: at android.os.Looper.loop(Looper.java:163) 1566550586.423 28478-28478/com.stone.stonemusic W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6393) 1566550586.423 28478-28478/com.stone.stonemusic W/System.err: at java.lang.reflect.Method.invoke(Native Method) 1566550586.424 28478-28478/com.stone.stonemusic W/System.err: at com.android.internal.os.ZygoteInit PerformClick.run(View.java:22465)1566550586.4222847828478/com.stone.stonemusicW/System.err:atandroid.os.Handler.handleCallback(Handler.java:754)1566550586.4232847828478/com.stone.stonemusicW/System.err:atandroid.os.Handler.dispatchMessage(Handler.java:95)1566550586.4232847828478/com.stone.stonemusicW/System.err:atandroid.os.Looper.loop(Looper.java:163)1566550586.4232847828478/com.stone.stonemusicW/System.err:atandroid.app.ActivityThread.main(ActivityThread.java:6393)1566550586.4232847828478/com.stone.stonemusicW/System.err:atjava.lang.reflect.Method.invoke(NativeMethod)1566550586.4242847828478/com.stone.stonemusicW/System.err:atcom.android.internal.os.ZygoteInitMethodAndArgsCaller.run(ZygoteInit.java:933)
1566550586.424 28478-28478/com.stone.stonemusic W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

原因:

这是我的源码

    //准备
    public static void prepare(String path) {
        if (getMediaPlayer() != null) {
            try {

                getMediaPlayer().reset();
                getMediaPlayer().setDataSource(path);
                getMediaPlayer().prepare();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    //开始
    public static void start() {
        if (getMediaPlayer() != null) {
            getMediaPlayer().start();
            MediaUtils.currentState = MediaStateCode.PLAY_START;
        }
    }

其实这样写是没有问题的,在调用本地音乐的时候,在调用网络歌曲的时候,高概率会出现上面报的java.lang.IllegalStateException异常。
出现这个异常的原因是调用方法的时机或者状态不对。然后我查阅了MediaPlay的生命周期流程图。下面附图。

Alt
参考一篇文章之后,发现是在reset()之后调用MediaPlayer对象的getDuration()方法引起的,所以我就不调用getDuration()方法,就解决了。

解释如下:
Idle 状态:当使用new()方法创建一个MediaPlayer对象或者调用了其reset()方法时,该MediaPlayer对象处于idle状态。这两种方法的一个重要差别就是:如果在这个状态下调用了getDuration()等方法(相当于调用时机不正确),通过reset()方法进入idle状态的话会触发OnErrorListener.onError(),并且MediaPlayer会进入Error状态;如果是新创建的MediaPlayer对象,则并不会触发onError(),也不会进入Error状态。
参考链接:https://blog.csdn.net/ddna/article/details/5178864

所以在出现MediaPlay有问题的情况下,还是看看他的状态和生命周期流程图比较好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java.lang.IllegalStateException android.media.MediaPlayer._prepare(Native Method) 的相关文章

  • 在 Jetpack Compose 中启动动画矢量 Drawable

    我有一个动画矢量可绘制R drawable my anim 我想在 Jetpack Compose 中展示并开始 可绘制对象显示 渲染正确 但动画未启动 这是撰写视图 Composable fun SplashView Surface mo
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • Android Webview 图像未加载

    我制作了一个简单的应用程序WebView 但有些图片无法加载 正确 在我的电脑上 错误 在模拟器中 Correct 错误 没有横幅 于是我用Chrome debug进行调试 发现我的代码被改变了 我不添加像noscript or style
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • 调节麦克风录音音量

    我们正在尝试调整录音时的音量级别 麦克风似乎非常敏感 会接收到很多静电 我们查看了 setVolumeControlStream 但找不到传入其中来控制麦克风的流 将您的音频源设置为 MIC using MediaRecorder Audi
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • Android:有没有办法以毫安为单位获取设备的电池容量?

    我想获取设备的电池容量来进行一些电池消耗计算 是否可以以某种方式获取它 例如 三星 Galaxy Note 2 的电池容量为 3100mAh 谢谢你的帮助 知道了 在 SDK 中无法直接找到任何内容 但可以使用反射来完成 这是工作代码 pu
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List
  • 在 Android 中,如何将字符串从 Activity 传递到 Service?

    任何人都可以告诉如何将字符串或整数从活动传递到服务 我试图传递一个整数 setpossition 4 但它不需要 启动时总是需要 0 Service 我不知道为什么我不能通过使用 Service 实例从 Activity 进行操作 publ
  • 如何删除因 Google Fitness API 7.5.0 添加的权限

    将我的 play services fitness api 从 7 0 0 更新到 7 5 0 后 我注意到当我将新版本上传到 PlayStore 时 它 告诉我正在添加一个新权限和 2 个新功能 我没有这样做 有没有搞错 在做了一些研究来
  • 在 Google 地图上绘制线条/路径

    我很长一段时间都在忙于寻找如何在 HelloMapView 中的地图上的两个 GPS 点之间画一条线 但没有运气 谁能告诉我该怎么做 假设我使用扩展 MapView 的 HelloMapView 我需要使用叠加层吗 如果是这样 我是否必须重

随机推荐