Android 11(API 30)环境下cordova-plugin-media音频流播放失败问题求助
解决方案:Android 11(API30)下cordova-plugin-media无法播放音频流的问题
我碰到过不少开发者在升级到Android 11后遇到cordova-plugin-media的流媒体播放问题,尤其是MEDIA_ERR_ABORTED(错误码1)的情况,结合你的场景(仅需播放网络流、20款应用依赖),给你几个经过验证的可行方案:
方案1:升级/补丁cordova-plugin-media插件
当前你使用的v5.0.3版本对API30的适配存在缺陷,推荐两种处理方式:
- 升级到最新稳定版:执行命令更新插件:
最新版本已经修复了不少高API版本的兼容性问题,尤其是流媒体播放的权限和Session管理。cordova plugin remove cordova-plugin-media && cordova plugin add cordova-plugin-media@latest - 手动添加AudioAttributes补丁:如果暂时不想升级,可以修改插件的Android原生代码(
platforms/android/app/src/main/java/org/apache/cordova/media/Media.java),在createMediaPlayer方法中添加AudioAttributes配置(Android 8.0+强制要求):
同时确保在播放前调用// 在mediaPlayer.setDataSource(...)之前添加 AudioAttributes attributes = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build(); mediaPlayer.setAudioAttributes(attributes);mediaPlayer.prepareAsync()而非同步的prepare(),避免阻塞主线程导致的abort错误。
方案2:补充Android 11必需的权限与配置
Android 11对媒体播放和网络访问有更严格的限制,需要补充以下配置:
- 添加媒体前台服务权限:在config.xml的Android平台下新增:
原有的<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA" />FOREGROUND_SERVICE权限在API30+已经被细分,媒体播放需要指定FOREGROUND_SERVICE_MEDIA。 - 明确允许明文网络访问:如果你的流是HTTP协议(而非HTTPS),在config.xml中添加:
虽然你设置了<platform name="android"> <edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application"> <application android:usesCleartextTraffic="true" /> </edit-config> </platform>AndroidInsecureFileModeEnabled,但这个配置主要针对本地文件,网络明文访问需要单独声明。 - 确保播放触发来自用户交互:Android 11禁止无用户交互的自动播放,务必保证
media.play()是在用户点击按钮的事件回调中执行,不能在页面加载或后台自动触发。
方案3:替换为更适合流媒体的插件
如果cordova-plugin-media的问题持续存在,推荐替换为专门针对流媒体优化的插件,比如cordova-plugin-streaming-media:
- 安装插件:
cordova plugin add cordova-plugin-streaming-media - 播放流的示例代码:
这个插件专门处理网络音频/视频流,对Android 11的适配更完善,且不需要录制功能的话完全满足需求。var options = { bgColor: "#000000", bgImage: "", bgImageScale: "fit", initFullscreen: false, keepAwake: true, mediaControls: true }; window.plugins.streamingMedia.playAudio('http://streams.radiobob.de/bob-chillout/aac-64/streams.radiobob.de/', options);
方案4:排查具体错误原因
如果以上方案无效,可以添加更详细的错误日志来定位问题:
- 在JS代码中扩展错误回调,获取更详细的信息:
var media = new Media(url, function() { console.log("播放成功"); }, function(err) { console.log("错误码: " + err.code + ", 消息: " + err.message); // 可以在这里添加更多调试信息,比如网络状态检查 } ); - 查看Android Studio的Logcat日志,过滤
MediaPlayer相关的错误,通常会有更具体的系统级错误提示(比如权限不足、流格式不支持等)。
内容的提问来源于stack exchange,提问作者emp user
相关产品推荐
相关产品推荐

