Ошибка MediaPlayer setDataSource со статусом = 0x80000000 для defaultUri - PullRequest
0 голосов
/ 30 мая 2018

У меня есть класс 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
    }
}

Это прекрасно работает на устройствах, на которых я тестирую, но мы столкнулись с проблемойгде одно из наших устройств падает на 100% при попытке setDataSource.

У нас есть несколько устройств, работающих под управлением 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 голосов
/ 30 мая 2018

Мне удалось воспроизвести эту проблему с помощью другого устройства, которое позволило мне установить мелодию звонка на «НЕТ».Хотя это невозможно на устройстве, на котором возникла проблема, я думаю, что это была проблема.

Теперь, чтобы разобраться с этим случаем, кажется, что вы должны сделать попытку / поймать, поскольку нет ничего, чтобы проверить, является ли источник действительным, прежде чем пытаться.

    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
    }
...