2012-02-06 45 views
2
播放聲音的WebView

我試圖從資產加載到WebView中的JavaScript代碼播放聲音:從JavaScript

WebView web_view = (WebView) findViewById(R.id.web_view); 
web_view.getSettings().setJavaScriptEnabled(true); 
web_view.setWebChromeClient(new WebChromeClient()); 
web_view.loadUrl("file:///assets/www/index.html"); 

我嘗試以下方法如何播放音頻與OGG,MP3和WAV文件的所有組合中,JavaSrcipt代碼是在資產/網絡/ JS/play.js:

audio = new Audio("../audio/sound.mp3"); 
audio.load(); 
audio.play(); 

audio = new Audio("./audio/sound.mp3"); 
audio.load(); 
audio.play(); 

audio = new Audio("audio/sound.mp3"); 
audio.load(); 
audio.play(); 

audio = new Audio("file:///android_asset/www/audio/sound.mp3"); 
audio.load(); 
audio.play(); 

audio = new Audio(); 
audio.src = document.getElementById("audio_tag").src; 
audio.load(); 
audio.play(); 

哪裏audio_tag是<audio id="audio_tag" src="audio/sound.mp3" preload="auto"></audio>,也試圖與路徑和格式的所有的組合。

但聲音是不是在玩,只知道什麼可能是錯誤的下面的一般錯誤:

E/MediaPlayer(1530): error (1, -2147483648)

從這個信息消息猜測,路徑的音頻文件應該是從第二谷第五情況下正確的:

I/StagefrightPlayer(33): setDataSource('file:///android_asset/www/audio/sound.mp3'); 

雖然這個問題可能被視爲 Android WebView playing audio with javascript重複,答案是不,無論如何,因爲shouldOverrideUrlLoading是從來沒有所謂的幫助,我想更精確地在這裏指定了這個問題。

你有什麼線索可能是錯誤的或如何找出它是什麼?

謝謝。

編輯:測試在銀河吉奧了Android 2.3給了我不同的一組錯誤的,但:

02-06 17:15:13.829: V/PlayerDriver(95): AddToScheduler 02-06 17:15:13.829: V/PlayerDriver(95): PendForExec 02-06 17:15:13.829: V/PlayerDriver(95): OsclActiveScheduler::Current 02-06 17:15:13.829: V/PlayerDriver(95): StartScheduler 02-06 17:15:13.829: V/PVPlayer(95): send PLAYER_SETUP 02-06 17:15:13.829: V/PlayerDriver(95): Send player code: 2 02-06 17:15:13.829: V/PlayerDriver(95): CommandCompleted 02-06 17:15:13.829: V/PlayerDriver(95): Completed command PLAYER_SETUP status=PVMFSuccess 02-06 17:15:13.829: V/PVPlayer(95): setDataSource(file:///android_asset/www/audio/sound.mp3) 02-06 17:15:13.839: V/PVPlayer(95): prepareAsync 02-06 17:15:13.839: V/PVPlayer(95): data source = file:///android_asset/www/audio/sound.mp3 02-06 17:15:13.849: V/PlayerDriver(95): Send player code: 3 02-06 17:15:13.849: V/PlayerDriver(95): handleSetDataSource 02-06 17:15:13.849: V/PlayerDriver(95): handleSetDataSource- scanning for extension
02-06 17:15:13.849: V/PlayerDriver(95): HandleInformationalEvent: PVMFInfoErrorHandlingStart 02-06 17:15:13.849: V/PlayerDriver(95): HandleInformationalEvent: type=26 UNHANDLED 02-06 17:15:13.849: W/MediaPlayer(4361): info/warning (1, 26) 02-06 17:15:13.849: V/PlayerDriver(95): CommandCompleted 02-06 17:15:13.849: V/PlayerDriver(95): Completed command PLAYER_SET_DATA_SOURCE status=PVMFErrNotSupported 02-06 17:15:13.849: E/PlayerDriver(95): Command PLAYER_SET_DATA_SOURCE completed with an error or info
PVMFErrNotSupported 02-06 17:15:13.849: E/MediaPlayer(4361): error (1, -4) 02-06 17:15:13.849: V/PVPlayer(95): run_init s=-2147483648, cancelled=0 02-06 17:15:13.849: V/PlayerDriver(95): HandleInformationalEvent: PVMFInfoErrorHandlingComplete 02-06 17:15:13.849: W/PlayerDriver(95): PVMFInfoErrorHandlingComplete
02-06 17:15:13.939: I/MediaPlayer(4361): Info (1,26) 02-06 17:15:13.939: E/MediaPlayer(4361): Error (1,-4) 02-06 17:15:13.939: V/PVPlayer(95): reset 02-06 17:15:13.939: V/PlayerDriver(95): Send player code: 18 02-06 17:15:13.939: V/PlayerDriver(95): handleCancelAllCommands 02-06 17:15:13.939: V/PlayerDriver(95): CommandCompleted 02-06 17:15:13.939: V/PlayerDriver(95): Completed command PLAYER_CANCEL_ALL_COMMANDS status=PVMFSuccess 02-06 17:15:13.939: V/PlayerDriver(95): Send player code: 11 02-06 17:15:13.939: V/PlayerDriver(95): handleReset 02-06 17:15:13.939: V/PlayerDriver(95): CommandCompleted 02-06 17:15:13.939: V/PlayerDriver(95): Completed command PLAYER_RESET status=PVMFSuccess 02-06 17:15:13.939: V/PlayerDriver(95): Send player code: 17 02-06 17:15:13.939: V/PlayerDriver(95): handleRemoveDataSource 02-06 17:15:13.939: V/PlayerDriver(95): CommandCompleted 02-06 17:15:13.939: V/PlayerDriver(95): Completed command PLAYER_REMOVE_DATA_SOURCE status=PVMFSuccess 02-06 17:15:13.939: V/PlayerDriver(95): remove datasource complete 02-06 17:15:13.939: V/PVPlayer(95): unmap file

+0

想我發現了一個奇妙的辦法解決這個。請檢查我的答案在這裏** http://stackoverflow.com/a/40634355/3866399** – 2016-11-16 14:16:01

回答

0

這取決於你的Android設備和可用的編解碼器上......不過,也許路徑是不正確的。你在使用Phonegap嗎?您的代碼是否在桌面瀏覽器上播放?

我使用了一個類似的代碼:

var myAudio = document.getElementsByTagName('audio')[0]; 
myAudio.pause(); 
myAudio.src = file; 
myAudio.play(); 

而我的HTML音頻標籤是這樣的:

<audio id="audio" src="" type="audio/mpeg" preload="metadata" ontimeupdate="timeUpdate()" 
    ondurationchange="durationChange()" onerror="musicError()" onended="musicEnded()"> 
<embed src="" height=50 width=100></embed> 

我使用的MP3音頻文件格式,因爲它適用於iOS和Android的一些設備。

此外,請注意,音頻標記元素不適用於所有Android版本。正如你可以看到here,它適用於Android 2.3及更高版本。

+0

謝謝你的另一種方式如何播放我以前沒有嘗試過的聲音。另外感謝您提及PhoneGap庫。這看起來很有趣,我會嘗試。我正在測試Android 2.3模擬器。但即使你的解決方案表現相同。 – Blackhex 2012-02-06 16:12:23

+0

即使在JavaScript代碼中指定了資源URI,資產URI也會在日誌中正確打印,所以我不認爲這是問題所在。在所有的桌面瀏覽器中它都能很好地工作。 – Blackhex 2012-02-06 16:19:03

+0

到目前爲止沒有任何幫助,所以我通過在本機代碼中播放聲音來解決問題。以後我會專注於問題的真正原因... – Blackhex 2012-02-07 19:22:03

7

回覆:MediaPlayer的():錯誤(1,-2147483648)

而Android的MediaPlayer所需要的媒體文件成爲世界可讀,使他們不能駐留在Eclipse項目中的「資產」文件夾中。將音頻/視頻文件推入設備外部存儲器。要做到這一點,使用模擬器,在Eclipse中使用DDMS Perspective(當模擬器運行時,轉到Window-> Open Prospective-> Other-> DDMS)來創建文件夾並將文件推送到SD卡映像或內部移動存儲。

參考上DDMS: http://developer.android.com/guide/developing/debugging/ddms.html

在個DDM,選擇左側的設備面板中你的模擬器,然後選擇右側的FileExplorer選項卡中查找一個到/ mnt/SD卡/,其中包含的文件夾SDCard內容,或者標準化應用程序存儲區的/ Android/data/package_name/files /。因此,在上面的例子中,如果你在SD卡上創建一個文件夾myaudio,文件名路徑爲:

audio = new Audio(「/ mnt/sdcard/myaudio/sound.mp3」);

參考: http://developer.android.com/guide/topics/data/data-storage.html#filesExternal

不要放棄HTML5!

+0

太棒了!非常感謝您的解釋。不幸的是,這個解決方案對我來說似乎很難辦。我不想用任何文件破壞用戶的SD卡。也許將這些文件存儲到應用程序的臨時存儲中會很好,但這不是世界可讀的地方,對吧?此外,由於在整個項目中有相對的聲音鏈接,所以我需要提取HTML和JS文件,這也是我不想要的。我現在用原生電話播放聲音很好。 – Blackhex 2012-05-07 07:03:33