我无法让Android MediaPlayer在AVD模拟器上播放运行API 25的Icecast服务器播放MP3流,而相同的代码适用于API 24及更低版本 . 具体来说,prepare()方法永远不会在附加的沙盒代码中返回,也没有声音 . 类似地,当我在服务中调用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(hostname)报告为true .

  • 我尝试将网址从http交换到https,但没有任何改进 .

  • 我尝试播放MP3文件(从Apache服务器获取),并在所有API版本中成功使用此代码 .

  • 音频音量已调高 .

  • 我研究并测试了在github(ZeroMediaPlayer和android-UniversalMusicPlayer)上发现的其他玩家的代码,但是没有找到我的问题 .

  • 此外,Android文档表示在API级别26中不推荐使用MediaPlayer.setAudioStreamType(int streamtype) . 我认为这不会影响我使用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

谢谢你的任何建议 .