我有一个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)
如何重现此崩溃并解决问题?
感谢您的时间。
答案 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
}