Невозможно передавать аудио после миграции на AndroidX - PullRequest
0 голосов
/ 23 января 2019

Пример кода аудиоплеера 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.

1 Ответ

0 голосов
/ 24 июля 2019

В конечном итоге я определил, что основной причиной является тот факт, что аудиопоток, который я пытался воспроизвести, обслуживается только через HTTP, а начиная с SDK 28 и далее вам необходимо явно разрешить подключение через не HTTPS, используя конфигурацию сетевой безопасности. , как подробно здесь:

Android MediaPlayer java.io.IOException: подготовка не удалась .: статус = 0x1

...