【问题标题】:Mediaplayer.prepare() crash with IllegalStateException, only for Xiaomi Note 3 & Xiaomi Mi4Mediaplayer.prepare() 崩溃并出现 IllegalStateException,仅适用于小米 Note 3 和小米 Mi4
【发布时间】:2017-09-10 11:38:34
【问题描述】:

对于我的闹钟应用,此错误仅适用于 Xiaomi Note 3Xiaomi Mi4 设备,并且适用于所有其他设备,包括我的个人小米红米 3S。

Exception java.lang.RuntimeException: Unable to start activity 

java.lang.IllegalStateException :
Caused by java.lang.IllegalStateException:
android.media.MediaPlayer._prepare (MediaPlayer.java)
android.media.MediaPlayer.prepare (MediaPlayer.java:1408)
android.app.Activity.performCreate (Activity.java:6912)
android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1126)
android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2877)
android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2985)
android.app.ActivityThread.-wrap14 (ActivityThread.java)
android.app.ActivityThread$H.handleMessage (ActivityThread.java:1635)
android.os.Handler.dispatchMessage (Handler.java:102)
android.os.Looper.loop (Looper.java:154)
android.app.ActivityThread.main (ActivityThread.java:6692)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1468)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1358)

【问题讨论】:

    标签: android android-mediaplayer illegalstateexception


    【解决方案1】:

    假设您在MediaPlayer.prepare() 之前提供data-source

    由于MediaPlayer.prepare() 阻塞了主线程,导致异常。为防止这种情况,请尝试使用MediaPlayer.prepareAsync() 而不是MediaPlayer.prepare()。对于此方法,请阅读 onPreparedListener()onErrorListener()
    如果这没有帮助,请查看thisthisthis

    【讨论】:

    • MediaPlayer.prepare() 只对小米和一些三星 Galaxy 设备失败,而对其他设备没有失败的任何原因?此外,我只使用设备媒体,不进行在线缓冲。
    • 在我的应用程序中,如果用户没有在设置中设置他选择的铃声/闹钟/音乐文件,则默认铃声响起。问题仅出现在默认铃声响起且用户未在应用设置中设置铃声/闹钟/音乐文件的情况下。
    • Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);此代码在所有其他设备上运行良好。
    • 这个修复应该有效。 Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); if (uri == null) { uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); if (uri == null) { // 警报备份为空,使用第二个备份 uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); } } 看起来 TYPE_RINGTONE 只为这些设备返回 null。
    • 在您的资产中导入默认曲调,如果是 uri = null,请将 uri 设置为该曲调。
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2018-09-21
    相关资源
    最近更新 更多