@ionic-native/media在Android端创建播放音频报callbackId: INVALID,iOS运行正常
问题触发原因
- Capacitor版本不兼容:项目中
@capacitor/core为正式版3.0.2,而@capacitor/android是预发布版3.0.0-rc.4,两者桥接层逻辑不一致,导致Cordova插件调用时回调ID生成异常,对应日志中的callbackId: INVALID报错,创建Media实例的请求无法被原生层正确接收。 - Android资源路径规则差异:iOS支持直接识别
/assets/开头的打包资源路径,但Android端Cordova插件无法直接读取该路径下的资源,传入的/assets/sounds/catHurt.wav在原生层找不到对应文件,即使桥接正常也会加载失败。 - 权限适配缺失:cordova-plugin-media 5.0.3在Capacitor3环境下运行需要额外的Android存储访问权限,未配置权限会导致本地音频读取被系统拦截。
解决方案
- 对齐Capacitor版本
将@capacitor/android升级到和核心库一致的3.0.2版本,修复桥接层异常,执行命令:
npm install @capacitor/android@3.0.2 --save-dev npx cap sync android
执行完成后重新构建Android项目即可解决callbackId: INVALID问题。
- 适配多平台资源路径
增加平台判断逻辑,给Android端的资源路径补充正确前缀,示例代码:
import { Platform } from '@ionic/angular'; import { Capacitor } from '@capacitor/core'; const baseAudioPath = '/assets/sounds/catHurt.wav'; let finalPath = baseAudioPath; if (Platform.is('android')) { // 两种路径转换方式二选一即可 finalPath = `public/${baseAudioPath}`; // 更推荐用Capacitor官方转换方法 // finalPath = Capacitor.convertFileSrc(baseAudioPath); } // 使用finalPath创建Media实例
- 补充Android权限配置
在android/app/src/main/AndroidManifest.xml的manifest节点下添加所需权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!-- 若需要播放网络音频额外添加 --> <!-- <uses-permission android:name="android.permission.INTERNET" /> -->
- 兼容优化方案(可选)
若调整后仍存在兼容问题,可替换为Capacitor生态专门适配的@capacitor-community/native-audio插件,无需依赖Cordova的media、file插件,跨端稳定性更高。
内容的提问来源于stack exchange,提问作者Mathieu Colla
相关产品推荐
相关产品推荐

