迁移到AndroidX后无法流音频

时间:2019-01-23 18:15:23

标签: android android-mediaplayer androidx

将项目迁移到AndroidX后,成功在线播放mp3音频的Google音频播放器代码示例就会失败。

我正在尝试按照最佳实践来构建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。我已成功将代码示例迁移到Android Studio中的AndroidX,并确认执行此操作后,示例应用程序仍可成功打开并播放本地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) 

我已经在线研究了其他有关“准备失败。:状态= 0x1”错误的报告,但对于起因似乎没有共识。

我尝试过更改代码,以在迁移到AndroidX之前和之后使用流。结果是一样的,只是在使用AndroidX时播放流时,应用程序如上所述失败。

更新:进一步的调试表明,我无需执行向AndroidX的完全迁移即可触发此错误。只需将代码示例使用的支持库从build.gradle中的v27.0.2更新到v28.0.0,就足以停止播放流。仅将它们升级到v27.1.1时,流仍然可以工作。但是,我将保留此问题的标题,因为开发人员触发此问题的最可能方法是按照Google的建议迁移到AndroidX。

1 个答案:

答案 0 :(得分:1)

我最终确定根本原因是我尝试播放的音频流仅通过HTTP提供,并且从SDK 28开始,您需要显式允许使用网络安全配置通过非HTTPS建立连接。 ,详情如下:

Android MediaPlayer java.io.IOException: Prepare failed.: status=0x1