MediaPlayer 在 Android 5.0 (Lollipop) 中抛出错误

MediaPlayer throwing errors in Android 5.0 (Lollipop)

我编写了一个使用 HTTP 连接流式传输 MP3 的媒体应用程序。这在 Android 版本 2.x - 4.x 上运行良好,但现在在 5.x 中产生错误。该应用循环播放包含 MP3 的播放列表对象,每个 MP3 都有自己唯一的 HTTP 地址。第一个文件流式传输正常,但下一个文件(与 哪个 文件无关)在调用 prepareAsync() 时产生以下错误:

07-04 18:57:19.785     65-10860/? E/NuCachedSource2﹕ source returned error -1, 10 retries left
07-04 18:57:22.874     65-10860/? E/NuCachedSource2﹕ source returned error -1, 9 retries left
07-04 18:57:25.907     65-10860/? E/NuCachedSource2﹕ source returned error -1, 8 retries left
07-04 18:57:28.929     65-10860/? E/NuCachedSource2﹕ source returned error -1, 7 retries left
07-04 18:57:31.972     65-10860/? E/NuCachedSource2﹕ source returned error -1, 6 retries left
07-04 18:57:35.024     65-10860/? E/NuCachedSource2﹕ source returned error -1, 5 retries left
07-04 18:57:38.062     65-10860/? E/NuCachedSource2﹕ source returned error -1, 4 retries left
07-04 18:57:41.085     65-10860/? E/NuCachedSource2﹕ source returned error -1, 3 retries left
07-04 18:57:44.110     65-10860/? E/NuCachedSource2﹕ source returned error -1, 2 retries left
07-04 18:57:47.262     65-10860/? E/NuCachedSource2﹕ source returned error -1, 1 retries left
07-04 18:57:50.294     65-10860/? E/NuCachedSource2﹕ source returned error -1, 0 retries left
07-04 18:57:50.419     65-10857/? E/GenericSource﹕ Failed to init from data source!
07-04 18:57:50.428    9592-9758/net.kicksass.shootingstarbbs.streamstar E/MediaPlayer﹕ error (1, -2147483648)
07-04 18:57:50.429    9592-9592/net.kicksass.shootingstarbbs.streamstar E/MediaPlayer﹕ Error (1,-2147483648)

一般来说,应用调用 MediaPlayer 的 setDataSource(url),然后调用 prepareAsync(),然后等待 onPreparedListener 触发,然后调用 start() 开始流式传输。流式传输完成后,它调用 reset(),然后调用 setDataSource(url),流程再次开始。

为什么 Lollipop 的 MediaPlayer 会抛出这个错误?

看起来 setDataSource(string) 方法用于自动编码传入的 URL 与先前版本的 Android 但不再在 v5.x 中。发生错误是因为 Web 服务器返回 HTTP 404 Not Found。当我在将 URL 传递给 setDataSource() 之前对它进行编码时,它起作用了。

更令人困惑的是,我的应用程序对 URL 的编码不一致,因此有时它可以工作,而其他时候则没有。

我在棒棒糖上也有这个问题。 URL 中的空格对我造成了这个问题。我用 %20 替换了空格,它工作正常。

used to be: mPlayer.setDataSource(myUrl);
changed to: mPlayer.setDataSource(myUrl.replaceAll(" ","%20"));

希望这对曾经遇到过这个问题的人也有帮助。编码技巧对我不起作用,但让我走上了为我解决这个问题的正确轨道。