You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的适配存在缺陷,推荐两种处理方式:

  • 升级到最新稳定版:执行命令更新插件:
    cordova plugin remove cordova-plugin-media && cordova plugin add cordova-plugin-media@latest
    
    最新版本已经修复了不少高API版本的兼容性问题,尤其是流媒体播放的权限和Session管理。
  • 手动添加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
    
  • 播放流的示例代码:
    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);
    
    这个插件专门处理网络音频/视频流,对Android 11的适配更完善,且不需要录制功能的话完全满足需求。

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 15:07:44