Android Media Player流 - 在模拟器中工作,在硬件上失败

时间:2013-03-06 19:58:53

标签: android media-player emulation hardware

我面临一个与Android,流媒体和媒体播放器相关的奇怪问题。

实际的应用程序非常复杂,但我已经提出了最简单的测试用例:“Hello,World”活动启动带有硬编码URL的Media Player。这在Android模拟器中工作正常,API级别7(这是真实应用程序的最低值)和API级别17.但是,相同的应用程序在API级别15的硬件设备上失败 - 在prepare()调用期间Media Player失败:

  • 如果使用阻止prepare(),则会因IOException而失败
  • 如果使用非阻塞的prepareAsync(),它将失败并且onErrorListener触发器(不会引发异常)。

总是失败(阻塞和非阻塞准备)显示“错误(1,-2147483648)”。 Media Player文档没有错误代码-2147483648(0xffffffff)。

该应用具有访问互联网的适当权限(android.permission.INTERNET),并且设备的互联网连接正常(同一个应用可以从互联网上下载文件)。

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

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

  • 使用pepareAsync()和onPreparedListener调用start()
  • 在Media Player上调用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();
}
}

1 个答案:

答案 0 :(得分:0)

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