Cordova:如何直接播放Android res/raw与iOS resources目录下的MP3
直接播放Android res/raw和iOS Resources目录下的MP3文件(无需复制到assets/www)
没问题,完全可以直接播放这两个平台原生目录里的音频文件,不用复制到assets/www下面。我分平台给你讲清楚具体的路径写法、实现代码和注意事项:
Android 平台
路径规则
Android 的res/raw目录下的音频文件,需要用Android资源URI来访问,格式为:
android.resource://你的应用包名/raw/文件名(不带后缀)
比如你的应用包名是com.yourcompany.yourapp,音频文件是notify.mp3,那么路径就是:
android.resource://com.yourcompany.yourapp/raw/notify
播放代码示例(使用cordova-plugin-media)
// 初始化Media对象 var notificationSound = new Media( 'android.resource://com.yourcompany.yourapp/raw/notify', function() { console.log('音频播放完成'); }, function(error) { console.error('播放失败:', error); } ); // 开始播放 notificationSound.play();
注意事项
res/raw目录下的文件名只能包含小写字母、数字和下划线,不能有空格或特殊字符,否则系统无法识别。- 确保文件已经正确放入
res/raw目录(如果是Cordova项目,你可以在platforms/android/app/src/main/res/raw下添加,或者通过config.xml配置自动复制)。
iOS 平台
路径规则
iOS 的resources目录下的文件会被打包到App的主Bundle中,你有两种可靠的路径写法:
- 直接写文件名(带后缀):比如
notify.mp3 - 使用Cordova的
cdvfile协议:cdvfile://localhost/bundle/notify.mp3
播放代码示例(使用cordova-plugin-media)
写法一:直接用文件名
var notificationSound = new Media( 'notify.mp3', function() { console.log('音频播放完成'); }, function(error) { console.error('播放失败:', error); } ); notificationSound.play();
写法二:使用cdvfile协议(更稳定)
var notificationSound = new Media( 'cdvfile://localhost/bundle/notify.mp3', function() { console.log('音频播放完成'); }, function(error) { console.error('播放失败:', error); } ); notificationSound.play();
关键配置
要确保音频文件被正确打包到iOS App中,需要在config.xml里添加如下配置:
<platform name="ios"> <!-- 将resources目录下的notify.mp3复制到App Bundle根目录 --> <resource-file src="resources/notify.mp3" target="notify.mp3" /> </platform>
注意事项
- iOS 文件名区分大小写,要确保代码里的文件名和实际文件完全一致(比如
Notify.mp3和notify.mp3是两个不同的文件)。 - 检查Xcode项目的
Build Phases > Copy Bundle Resources中是否包含你的音频文件,确保打包时不会遗漏。
权限说明
不需要额外申请特殊权限:
- Android:播放
res/raw里的私有资源,默认权限足够,不需要额外添加权限(如果是播放系统通知关联的音频,仅当你需要触发系统通知时才需要POST_NOTIFICATIONS权限,单纯播放音频不需要)。 - iOS:播放Bundle内的本地音频,不需要任何权限;如果需要后台播放,才需要配置后台模式,但通知类音频一般是前台或通知触发时播放,不需要额外配置。
常见排查点
如果播放失败,可以检查:
- 文件名是否符合平台规范(Android小写无特殊字符、iOS大小写一致)。
- 文件是否被正确打包到对应平台的目录中。
- 确认
cordova-plugin-media是最新版本,旧版本可能存在路径兼容问题。
内容的提问来源于stack exchange,提问作者lui
相关产品推荐
相关产品推荐

