我无法使用Cordova Media插件播放本地声音。
我的platforms\android\res\xml\config.xml
这里有正确的选项......
<content src="index.html" />
<access origin="*" />
<preference name="loglevel" value="DEBUG" />
<feature name="App">
<param name="android-package" value="org.apache.cordova.App" />
</feature>
<feature name="Device">
<param name="android-package" value="org.apache.cordova.device.Device" />
</feature>
<feature name="File">
<param name="android-package" value="org.apache.cordova.file.FileUtils" />
</feature>
<feature name="Media">
<param name="android-package" value="org.apache.cordova.media.AudioHandler" />
</feature>
<feature name="SplashScreen">
<param name="android-package" value="org.apache.cordova.splashscreen.SplashScreen" />
</feature>
...以及AndroidManifest.xml
...
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
然而,当我尝试播放声音时,我什么都没得到:
注意:我正在使用Apache Cordova 3.3.0
答案 0 :(得分:17)
管理最终弄清楚你必须引用相对于window.location.pathname
的文件路径,因为当运行Apache Cordova时,根是file:///android_asset/www/
所以声音必须像{{1}那样被引用1}}。
这是我的完整解决方案:
/android_asset/www/path/to/a/sound.mp3
例如,我的var audio = {
root: '',
localPath: '/assets/sounds/',
manifest: {
bang: 'bang.mp3',
boom: 'boom.mp3',
splat: 'splat.mp3',
splash: 'splash.mp3'
},
sounds: {},
parse: function () {
var p = window.location.pathname;
this.root = p.substring(0, p.lastIndexOf('/')) + this.localPath;
console.log(this.root);
for (var sound in this.manifest) {
var src = this.root + this.manifest[sound];
console.log('Getting sound: ' + src);
this.sounds[sound] = (typeof Media !== 'undefined') ? new Media(src) : new Audio(src);
console.log('Created sound:');
$('#sounds').append($('<li></li>').html(src));
}
}
};
audio.parse();
位于我的根目录中,从我的角度来看基本上是index.html
(./
文件夹)。
我的所有声音都在两个子文件夹www
内。
在我的电脑上托管该应用时./assets/sounds/
显示为window.location.pathname
:
但是,当我在移动设备上托管时,它是:
答案 1 :(得分:5)
在通过Android MediaPlayer进行了一些关于Media插件如何通过Android {{3}}天真地播放音频之后,我发现由于某些未知原因,\platforms\androidAndroidManifest.xml
中需要以下权限。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
互联网权限 - 如果您使用MediaPlayer传输基于网络的内容,则您的应用必须请求网络访问。
我只能猜测,因为您尝试通过WebView流式传输本地媒体,因此需要此权限才能正常运行。
然而,获得比undefined
更好的错误消息会更好。
code: 1
message: Missing Android permission
Apache Cordova应该在安装插件时自动添加此权限。
编辑:实际上这只是访问远程音频文件的部分修复方法,我还没有让本地文件正常工作。
答案 2 :(得分:3)
这是我的代码,它有效。确保安装device plugin
if(selectedSoundOption === "Coins"){
var coin180Url = getMediaURL("sounds/coin180.mp3");
var coin180 = new Media(coin180Url, null, mediaError);
var coin360Url = getMediaURL("sounds/coin360.wav");
var coin360 = new Media(coin360Url, null, mediaError);
if(rotation.indexOf("360") > -1){
coin180.play();
}else{
coin360.play();
}
}
}
function mediaError(e) {
alert('Media error '+e);
}
function getMediaURL(s) {
if(device.platform.toLowerCase() === "android") return "/android_asset/www/" + s;
return s;
}
答案 3 :(得分:0)
在android \ platforms \ androidAndroidManifest.xml中添加以下行后,会播放声音。
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
感谢约书亚,你的解决方案适合我。