Android MediaPlayer无法在使用API​​ 25的模拟器上播放MP3流

时间:2018-09-17 04:21:09

标签: java android audio android-mediaplayer

我无法让Android MediaPlayer从在AVD模拟器上运行API 25的Icecast服务器播放MP3流,而相同的代码则可以在API 24及以下版本上运行。具体来说,prepare()方法从不返回附带的沙箱代码,并且没有声音。同样,当我在Service中调用prepareAsync()时,永远不会调用任何侦听器。 Logcat没有报告错误。

我正在编写处理API 26及更高版本的代码,但仍停留在API 25上。

到目前为止调试:

  • 我尝试了几种MP3音乐流。以下是无法在API 25+上播放的两个示例:http://pureradio.eu:8000/low http://shoutingfire-ice.streamguys1.com/live
  • 这两个(和其他)MP3流都可以在API 24及以下版本上成功播放。
  • NetworkSecurityPolicy.isCleartextTrafficPermitted(主机名)报告为true。
  • 我尝试将URL从http交换为https,但是没有任何改善。
  • 我尝试播放MP3文件(从Apache服务器获取),并且在所有API版本中都可以使用此代码成功播放。
  • 调高音量。
  • 我研究并测试了github上其他播放器(ZeroMediaPlayer和android-UniversalMusicPlayer)的代码,但没有发现我的问题。
  • 此外,Android文档说MediaPlayer.setAudioStreamType(int streamtype)在API级别26中已弃用。我不认为这会影响使用API​​ 25进行的测试。

这是我的沙盒代码段。

MediaPlayer mediaPlayer = new MediaPlayer();
// For Android API 26 (Android 8 Oreo) and newer, specify AudioAttributes.
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
    AudioAttributes.Builder builder = new AudioAttributes.Builder();
    builder.setUsage(AudioAttributes.USAGE_MEDIA);
    builder.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC);
    AudioAttributes attributes = builder.build();
    mediaPlayer.setAudioAttributes(attributes);
}
else {
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
try {
    mediaPlayer.setOnPreparedListener(this);
    mediaPlayer.setOnBufferingUpdateListener(this);
    mediaPlayer.setOnInfoListener(this);
    mediaPlayer.setOnErrorListener(this);
    mediaPlayer.setOnCompletionListener(this);

    mediaPlayer.setDataSource(url);
    mediaPlayer.prepare();
}
catch(Exception e) {
    Log.d(tag,"ERROR: Caught exception e=" + e.getMessage());
}
mediaPlayer.start();

以及我模块的build.gradle的摘录:

compileSdkVersion 26
buildToolsVersion "27.0.3"
minSdkVersion 14
targetSdkVersion 26

谢谢您的建议。

0 个答案:

没有答案