【问题标题】:MediaPlayer setDataSource failed with status=0x80000000 for defaultUriMediaPlayer setDataSource 失败,defaultUri 的 status=0x80000000
【发布时间】:2018-05-30 18:01:20
【问题描述】:

我创建了一个 RingTone 类来播放设备的铃声,可以是一次或循环播放。

class RingTone(context: Context) {

    private val player = MediaPlayer()
    private val audioManager: AudioManager

    init {
        val alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)
        player.setDataSource(context, alert) // this line may crash

        audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
    }

   fun play(isLooping: Boolean = true): RingTone {
        if (audioManager.getStreamVolume(AudioManager.STREAM_RING) != 0) {
            val attributes = AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                    .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                    .build()

            player.setAudioAttributes(attributes)
            player.isLooping = isLooping
            player.prepare()
            player.start()
        }
        return this
    }
}

这在我正在测试的设备上运行良好,但我们遇到了一个问题,即我们的一个设备在尝试setDataSource 时会 100% 崩溃。

我们有多个相同的设备,都运行 Android 5.1。

例外:

Caused by java.io.IOException: setDataSource failed.: status=0x80000000
       at android.media.MediaPlayer.nativeSetDataSource(MediaPlayer.java)
       at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1090)
       at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1079)
       at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1032)
       at android.media.MediaPlayer.setDataSource(MediaPlayer.java:968)
       at com.xxxx.yyy.RingTone.<init>(RingTone.kt:21)

如何重现此崩溃并解决问题?

感谢您的宝贵时间。

【问题讨论】:

    标签: android android-mediaplayer ringtone


    【解决方案1】:

    我能够通过使用另一个允许我将铃声设置为“无”的设备重现此问题。虽然这在出现问题的设备上是不可能的,但我认为这就是问题所在。

    现在,要处理这种情况,您似乎必须执行 try/catch,因为在尝试之前没有任何东西可以检查源是否有效。

        initialized = try {
            player.setDataSource(context, alert)
            true
        } catch (ex: IOException) {
            false
        }
    

    然后在play内。

       fun play(isLooping: Boolean = true): RingTone {
            if (initialized && audioManager.getStreamVolume(AudioManager.STREAM_RING) != 0) {
                  ...
            }
            return this
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-15
      • 2017-09-04
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多