对于defaultUri,MediaPlayer setDataSource失败,状态为0x80000000

时间:2018-05-30 18:01:21

标签: android android-mediaplayer ringtone

我有一个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)

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

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

我能够通过使用另一个设备来重现此问题,该设备允许我将我的铃声设置为&#34; NONE&#34;。虽然在遇到问题的设备上这是不可能的,但我认为这是问题所在。

现在,为了处理这种情况,你似乎必须做一个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
    }