从JavaScript中播放WebView中的声音

Bla*_*hex 2 javascript audio android 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");
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法的所有组合,如何使用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();
Run Code Online (Sandbox Code Playgroud)

audio_tag的位置<audio id="audio_tag" src="audio/sound.mp3" preload="auto"></audio>,也尝试使用路径和格式的所有组合.

但是声音没有播放,只知道可能出现的错误是遵循一般错误:

E/MediaPlayer(1530):错误(1,-2147483648)

从这条信息消息中猜测,音频文件的路径应该适用于第二个第五个案例:

I/StagefrightPlayer(33): setDataSource('file:///android_asset/www/audio/sound.mp3');
Run Code Online (Sandbox Code Playgroud)

虽然这个问题可能被认为是Android WebView使用javascript播放音频的重复, 但答案无论如何都没有帮助,因为永远不会调用shouldOverrideUrlLoading,我试图在这里更准确地指出这个问题.

你有什么可能是错的线索或如何找出它是什么?

谢谢.

编辑:使用Android 2.3在Galaxy Gio中测试给出了不同的错误集:

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):发送播放器代码: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/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):发送播放器代码: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:PVMF InfoErrorHandlingStart 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):已完成命令PLAYER_SET_DATA_SOURCE status = PVMFErrNotSupported 02-06 17:15:13.849:E/PlayerDriver(95) ):命令PLAYER_SET_DATA_SOURCE已完成,错误或信息
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):发送播放器代码: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 status = PVMFSuccess 02-06 17:15 :13.939:V/PlayerDriver(95):删除数据源完成02-06 17:15:13.939:V/PVPlayer(95):unmap文件

小智 7

Re:MediaPlayer():错误(1,-2147483648)

Android MediaPlayer需要媒体文件是世界可读的,因此它们不能驻留在Eclipse项目内的"assets"文件夹中.将音频/视频文件推送到设备外部存储设备.为此,使用模拟器,在Eclipse中使用DDMS Perspective(在模拟器运行时转到Window-> Open Prospective-> Other-> DDMS)创建文件夹并将文件推送到SD卡图像或内部(非移动存储.

关于DDMS的参考:http: //developer.android.com/guide/developing/debugging/ddms.html

在DDM中,在左侧的"设备"面板中选择您的模拟器,然后选择右侧的FileExplorer选项卡,查找名为/ mnt/sdcard /的文件夹,其中包含SDCard内容,或者////data/package_name /文件/用于标准化应用程序的存储区域.因此,在上面的示例中,如果您在SD卡上创建文件夹myaudio,则文件名路径为:

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

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

并且不要放弃HTML5!