Я работаю с импортом android.media.MediaPlayer и проигрываю mp3-файлы с внешнего хранилища. Пример, который я использую, хорошо работает на Android с версией ниже 10. Когда я пытаюсь воспроизвести файлы с внешнего хранилища на Android 10 (OnePlus 6). Я получаю исключение.
Код из моей службы
mediaPlayer?.let {
with(it) {
setOnCompletionListener(this@MediaPlayerService)
setOnErrorListener(this@MediaPlayerService)
setOnPreparedListener(this@MediaPlayerService)
setOnBufferingUpdateListener(this@MediaPlayerService)
setOnSeekCompleteListener(this@MediaPlayerService)
setOnInfoListener(this@MediaPlayerService)
reset()
setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
)
try {
setDataSource(mediaFile)
} catch (e: Exception) {
println(e.printStackTrace())
stopSelf()
}
prepareAsync()
}
Код для получения файлов из хранилища
val uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
val selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0"
val sortOrder = MediaStore.Audio.Media.TITLE + " ASC"
val cursor = contentResolver.query(uri, null, selection, null, sortOrder)
cursor?.let {
if (it.count > 0) {
while (it.moveToNext()) {
val data = it.getString(it.getColumnIndex(MediaStore.Audio.Media.DATA))
val title = it.getString(it.getColumnIndex(MediaStore.Audio.Media.TITLE))
val album = it.getString(it.getColumnIndex(MediaStore.Audio.Media.ALBUM))
val artist = it.getString(it.getColumnIndex(MediaStore.Audio.Media.ARTIST))
audioList.add(Audio(data, title, album, artist))
}
}
}
cursor?.close()
Трассировка стека
Process: ru.example.mymediaplayer, PID: 30394
java.lang.RuntimeException: Unable to start service ru.example.mymediaplayer.MediaPlayerService@fcc80f8 with Intent { cmp=ru.example.mymediaplayer/.MediaPlayerService (has extras) }: java.lang.IllegalStateException
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4222)
at android.app.ActivityThread.access$2100(ActivityThread.java:231)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1984)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Caused by: java.lang.IllegalStateException
at android.media.MediaPlayer.prepareAsync(Native Method)
at ru.example.mymediaplayer.MediaPlayerService.initMediaPlayer(MediaPlayerService.kt:198)
at ru.example.mymediaplayer.MediaPlayerService.onStartCommand(MediaPlayerService.kt:47)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4204)
at android.app.ActivityThread.access$2100(ActivityThread.java:231)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1984)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)