Android媒体播放器流媒体-在模拟器中工作,在硬件上失败



我遇到了一个与Android、流媒体和Media Player相关的奇怪问题。

实际的应用程序是相当复杂的,但我已经把最简单的可能的测试用例:一个'Hello, World'活动启动媒体播放器与硬编码的URL。这在Android模拟器中工作得很好,无论是API级别7(这是实际应用程序的最低要求)还是API级别17。然而,同样的应用程序在API级别为15的硬件设备上失败- Media Player在prepare()调用期间失败:

  • 如果使用阻塞的prepare(),它会失败,并伴有IOException
  • 如果使用非阻塞的prepareAsync(),它会失败并触发onErrorListener(不会引发异常)。

失败总是(阻塞和非阻塞准备)显示"Error(1,-2147483648)"。媒体播放器文档没有这样的错误代码-2147483648 (0xffffffff).

app具有正确的上网权限(android.permission.INTERNET),且设备的互联网连接正常(同一app可以从互联网下载文件)。

这不是编解码器问题-因为模拟器可以播放相同的流,因为任何其他流在硬件设备上以相同的方式失败。

尝试了许多其他的事情,但都没有帮助:

  • 使用pepareAsync()和onPreparedListener调用start()
  • 在媒体播放器上调用reset()
  • 通过Uri.parse()设置数据源
  • 从音频管理器获取音频焦点

硬件工作正常,因为同一设备可以使用Android内置的默认音频播放器应用程序从其存储播放音频文件。

我不太相信鬼魂的存在,但我已经没有其他选择了。有人见过这样的东西吗?该应用程序在模拟器工作,但不是在硬件上?

有没有人可以在硬件设备上尝试这个代码(我只有1个Android设备)?

public class MainActivity extends Activity {
private MediaPlayer mediaPlayer;
private String listen_url = "http://stream15.top-ix.org:80/radiojukebox-low";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mediaPlayer = new MediaPlayer();
    //mediaPlayer.reset();
    try {
        mediaPlayer.setDataSource(listen_url);
        //mediaPlayer.setDataSource(this, Uri.parse(listen_url));
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        mediaPlayer.prepare();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
                    // We fail here!
        e.printStackTrace();
    }
    mediaPlayer.start();
}
}

这通常是因为您正在使用的设备不支持流类型。你试过简单的MP3流吗?

最新更新