JavaScriptからWebViewでサウンドを再生する

私は資産からWebViewにロードされた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コードはassets/www/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が の場合も、パスとフォーマットのすべての組み合わせが試されます。

しかし、音は再生されていませんし、何が間違っているかもしれないのか単なる手がかりは、

E/MediaPlayer(1530):エラー(1、-2147483648)

この情報メッセージから推測すると、オーディオファイルへのパスは、2番目のトラフの5番目のケースで正しいはずです。

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

この質問は、 shouldOverrideUrlLoadingはjavascriptを使用してAndroid WebViewを再生しています。私はこの問題をより正確にここで指定しようとしています。

何が間違っているのか、それが何であるかを知る手掛かりはありますか?

ありがとうございました。

編集:ギャラクシーGioのテスト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):PLAYER_SETUPを送信02-06 17:15:13.829:   V/PlayerDriver(95):プレイヤーコードを送信する:2 02-06 17:15:13.829:   V/PlayerDriver(95):CommandCompleted 02-06 17:15:13.829:   V/PlayerDriver(95):完了したコマンドPLAYER_SETUP status = PVMFSuccess   02-06 17:15:13.829:V/PVP層(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):データソース=   ファイル:///android_asset/www/audio/sound.mp3 02-06 17:15:13.849:   V/PlayerDriver(95):プレイヤーコードを送信する:3 02-06 17:15:13.849:   V/PlayerDriver(95):handleSetDataSource 02-06 17:15:13.849:   V/PlayerDriver(95):handleSetDataSource-拡張機能のスキャン
  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):情報/警告(1、26)02-06 17:15:13.849:   V/PlayerDriver(95):CommandCompleted 02-06 17:15:13.849:   V/PlayerDriver(95):コマンドPLAYER_SET_DATA_SOURCEを完了しました   ステータス= PVMFErrNotSupported 02-06 17:15:13.849:E/PlayerDriver(95):   コマンドPLAYER_SET_DATA_SOURCEがエラーまたは情報付きで完了しました
  PVMFErrNotSupported 02-06 17:15:13.849:E/MediaPlayer(4361):エラー   (1、-4)02-06 17:15:13.849:V/PVPlayer(95):run_init s = -2147483648、   キャンセル済み:0 02-06 17:15:13.849:V/PlayerDriver(95):   HandleInformationalEvent:PVMFInfoErrorHandlingComplete 02-06   17:15:13.849:PlayerDriver(95):PVMFInfoErrorHandlingComplete
  02-06 17:15:13.939:I/MediaPlayer(4361):情報(1,26)02-06   17:15:13.939:E/MediaPlayer(4361):エラー(1、-4)02-06 17:15:13.939:   V/PVPlayer(95):リセット02-06 17:15:13.939:V/PlayerDriver(95):送信   プレーヤーコード: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):完了   コマンドPLAYER_CANCEL_ALL_COMMANDS status = PVMFSuccess 02-06   17:15:13.939:V/PlayerDriver(95):プレーヤコードを送信: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):完了したコマンドPLAYER_RESET status = PVMFSuccess   02-06 17:15:13.939:V/PlayerDriver(95):プレイヤーコードを送信: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):完了したコマンド   PLAYER_REMOVE_DATA_SOURCEステータス= PVMFSuccess 02-06 17:15:13.939:   V/PlayerDriver(95):データソースを完全に削除する02-06 17:15:13.939:   V/PVPlayer(95):unmapファイル

2
私はこれに対して素晴らしい回避策を見つけたと思う。私の答えをここで確認してください。 stackoverflow.com/a/40634355/3866399
追加された 著者 Rodrigo Borba,

3 答え

Re:MediaPlayer():エラー(1、-2147483648)

The Android MediaPlayer needs the media files to be world-readable so they can’t reside in the “assets” folder inside the Eclipse project. Push the audio/video files onto the device external storage. To do this, with an emulator, use the DDMS Perspective in Eclipse (while your emulator is running go to Window->Open Prospective->Other->DDMS) to create a folder and push files onto SD card image or internal (non-removable) storage.

Reference on DDMS: http://developer.android.com/guide/developing/debugging/ddms.html

DDMでは、左側の[デバイス]パネルで自分のエミュレータを選択し、右側の[FileExplorer]タブを選択して、SDCardの内容を含む/ mnt/sdcard /という名前のフォルダ、または/ Android/data/package_name /ファイル/標準化されたアプリケーションのストレージ領域。したがって、上記の例では、SDカードにmyaudioフォルダを作成すると、ファイル名のパスは次のようになります。

audio =新しいオーディオ( "/ mnt/sdcard/myaudio/sound.mp3");

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

HTML5をあきらめないでください!

7
追加された
すばらしいです!説明に感謝します。残念ながら、この解決策は私にとってはかなりハッキリです。私はどんなファイルでもユーザーのSDカードを台無しにしたくありません。おそらくこれらのファイルをアプリケーションの一時的な記憶領域に保存しても問題ありませんが、これは世界で読める場所ではありません。さらに、プロジェクト全体を通してサウンドへの相対的なリンクがあるので、HTMLファイルとJSファイルも抽出する必要があります。これも私が望んでいないものです。私は今ではネイティブコールで音を鳴らすことができます。
追加された 著者 Blackhex,

I had the same problem and finally i'm using phonegap and cordova where you can play and record audios easily: http://docs.phonegap.com/en/2.9.0/cordova_media_media.md.html

2
追加された

それはあなたのAndroidデバイスと利用可能なコーデックに依存します...しかし、おそらくパスが正しくありません。 Phonegapを使用していますか?あなたのコードはデスクトップブラウザで再生されますか?

私は同様のコードを使用しています:

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

私のHTMLオーディオタグはこれです:

iOSと一部のAndroid搭載端末で動作するため、mp3形式のオーディオファイルを使用しています。

また、オーディオタグエレメントは、すべてのアンドロイドバージョンで利用できるわけではありません。 こちらをご覧ください。Android 2.3以降で動作します。

0
追加された
私が以前に試したことのない音を再生するための別の方法をありがとう。また、PhoneGapライブラリに言及してくれてありがとう。それは非常に面白そうだと私はそれを試してみましょう。 Android 2.3エミュレータでテスト中です。しかし、あなたのソリューションでも同じように動作します。
追加された 著者 Blackhex,
アセットURIは、JavaScriptコードで相対的に指定されていてもログに正しく表示されるので、これは問題ではないと思います。また、すべてのデスクトップブラウザでうまく動作します。
追加された 著者 Blackhex,
これまで何も役に立たなかったので、ネイティブコードでサウンドを再生することで問題を解決しました。後で問題の本当の原因に焦点を当てます...
追加された 著者 Blackhex,
JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript