代码之家  ›  专栏  ›  技术社区  ›  advice

mediaplayer setdatasource失败,defaulturi的状态为0x8000000

  •  0
  • advice  · 技术社区  · 6 年前

    我有一个铃声类我做了播放设备的铃声,要么一次或循环。

    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 .

    我们有多个相同的设备,都运行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 回复  |  直到 6 年前
        1
  •  0
  •   advice    6 年前

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

    现在,为了处理这种情况,似乎必须执行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
        }
    
    推荐文章