2

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

实际的应用程序相当复杂,但我提出了最简单的测试用例:“Hello, World”活动启动带有硬编码 URL 的媒体播放器。这在 Android 模拟器中运行良好,API 级别 7(这是真实应用程序的最低级别)和 API 级别 17。但是,同一个应用程序在 API 级别 15 的硬件设备上失败 - 媒体播放器在 prepare() 调用期间失败:

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

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

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

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

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

  • 使用 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();
}
}
4

1 回答 1

0

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

于 2013-03-06T20:22:19.580 回答