我无法让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
谢谢你的任何建议 .