Пример кода аудиоплеера Google, который успешно воспроизводит аудиофайлы в формате mp3 из онлайн-потока, завершается неудачно, как только проект переносится на AndroidX.
Я пытаюсь следовать рекомендациям по созданию приложения Media Player, как описано здесь: https://developer.android.com/guide/topics/media-apps/audio-app/building-an-audio-app
В нижней части этой страницы находится ссылка на этот пример кода: https://github.com/googlesamples/android-MediaBrowserService/
В этом примере создается простое приложение для воспроизведения мультимедиа, которое воспроизводит локальные mp3-файлы, а не поток.
Наименьшее возможное изменение, которое я могу внести в образец, чтобы он воспроизводил поток, а не файл, - это изменить в com.example.android.mediasession.service.players.MediaPlayerAdapter следующее:
AssetFileDescriptor assetFileDescriptor = mContext.getAssets().openFd(mFilename);
mMediaPlayer.setDataSource(
assetFileDescriptor.getFileDescriptor(),
assetFileDescriptor.getStartOffset(),
assetFileDescriptor.getLength());
до
mMediaPlayer.setDataSource("http://109.228.17.230:80/");
Это успешно работает. Поток воспроизводится при нажатии кнопки воспроизведения.
Однако этот пример кода не был перенесен в AndroidX. Он все еще использует библиотеку поддержки v27.0.2. Я успешно перенес образец кода в AndroidX в Android Studio и подтвердил, что после этого образец приложения все еще успешно открывается и воспроизводит локальные mp3-файлы.
Если, однако, я выполню вышеуказанное изменение кода после переноса проекта на AndroidX, AndroidX, MediaPlayer.prepare () завершится неудачно со следующей трассировкой стека:
E/MediaPlayerNative: error (1, -2147483648)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.mediasession, PID: 11609
java.lang.RuntimeException: Failed to prepare stream:
at com.example.android.mediasession.service.players.MediaPlayerAdapter.playFile(MediaPlayerAdapter.java:130)
at com.example.android.mediasession.service.players.MediaPlayerAdapter.playFromMedia(MediaPlayerAdapter.java:87)
at com.example.android.mediasession.service.MusicService$MediaSessionCallback.onPlay(MusicService.java:145)
at android.support.v4.media.session.MediaSessionCompat$Callback$StubApi21.onPlay(MediaSessionCompat.java:1404)
at android.support.v4.media.session.MediaSessionCompatApi21$CallbackProxy.onPlay(MediaSessionCompatApi21.java:196)
at android.media.session.MediaSession$CallbackMessageHandler.handleMessage(MediaSession.java:1486)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.io.IOException: Prepare failed.: status=0x1
at android.media.MediaPlayer._prepare(Native Method)
at android.media.MediaPlayer.prepare(MediaPlayer.java:1282)
at com.example.android.mediasession.service.players.MediaPlayerAdapter.playFile(MediaPlayerAdapter.java:128)
at com.example.android.mediasession.service.players.MediaPlayerAdapter.playFromMedia(MediaPlayerAdapter.java:87)
at com.example.android.mediasession.service.MusicService$MediaSessionCallback.onPlay(MusicService.java:145)
at android.support.v4.media.session.MediaSessionCompat$Callback$StubApi21.onPlay(MediaSessionCompat.java:1404)
at android.support.v4.media.session.MediaSessionCompatApi21$CallbackProxy.onPlay(MediaSessionCompatApi21.java:196)
at android.media.session.MediaSession$CallbackMessageHandler.handleMessage(MediaSession.java:1486)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Я исследовал другие сообщения об ошибке «Prepare fail: status = 0x1» онлайн, но, похоже, нет единого мнения относительно причины.
Я пытался изменить код для использования потока перед миграцией на AndroidX и после. Результат тот же, с ошибкой приложения, как указано выше, при воспроизведении потока, но только при использовании AndroidX.
ОБНОВЛЕНИЕ: дальнейшая отладка показала, что мне не нужно выполнять полную миграцию на AndroidX, чтобы вызвать эту ошибку. Достаточно просто обновить библиотеки поддержки, используемые примером кода, с v27.0.2 до v28.0.0 в build.gradle, чтобы остановить воспроизведение потока. Потоковая передача по-прежнему работает, когда они обновлены только до версии 27.1.1. Однако я оставлю заголовок этого вопроса без изменений, поскольку наиболее вероятный способ, которым разработчик может вызвать эту проблему, - это перейти на AndroidX в соответствии с рекомендациями Google.