2014-01-20 79 views
4

我一直無法使用Cordova Media插件播放本地聲音。媒體插件錯誤代碼:1

我在我這裏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" /> 

許可選項然而,當我嘗試播放聲音我什麼都沒得到:

enter image description here

注:我使用的Apache Cordova 3.3.0

回答

12

管理弄明白在你必須引用相對於window.location.pathname文件路徑末尾當通過Apache Cordova的運行根是file:///android_asset/www/這樣的聲音必須像這樣/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顯示爲/應用:

enter image description here

但是我的移動設備上託管的時候,它是:

enter image description here

+0

我與本地文件有相同的錯誤。你說「android_asset/www /」和「/ assets/sounds /」之後,我不明白...要放的路徑是什麼?我的文件在構建之前在「nameOfApp/www/data /」中 – JoDiii

+0

更新了更多解釋讓我知道它現在是否有意義。 –

+0

說我使用音頻API。如何判斷音頻是否完成播放? – tjvg1991

2

做了一些挖掘,以媒體插件如何去有關通過Android的MediaPlayer天真地播放音頻後,我看到一些未知的原因如下權限要求在\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科爾多瓦應該已經自動把此權限。

編輯:其實這只是部分修復訪問遠程音頻文件我還沒有得到本地文件的工作。

+0

我沒有WAKE_LOCK和互聯網之一(以及所有其他)插件創建(我沒有手動編輯清單)。就像我在我的答案中說的那樣,它可以在Android上使用本地文件,所以我不確定這會有所幫助。 –

2

這裏是我的代碼,它作品。請確保安裝了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; 
} 
+0

這是一種硬編碼的平臺解決方案。無論平臺如何,您都可以使用我的解決方案實際獲得確切的根目錄。 –

0

在android \ platforms \ androidAndroidManifest.xml中添加以下行後,會播放聲音。

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> 

謝謝約書亞,你的解決方案對我來說很有用。