从JavaScript在WebView中播放声音

从JavaScript在WebView中播放声音,javascript,android,webview,audio,Javascript,Android,Webview,Audio,我正在尝试播放从资源加载到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");

我正在尝试播放从资源加载到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_标记是
,并且答案无论如何都没有帮助,因为从来没有调用过shouldOverrideUrlLoading,我试图在这里更精确地指定这个问题

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

多谢各位

编辑:使用Android 2.3在Galaxy Gio中进行测试会给我带来不同的错误:

02-06 17:15:13.829:V/PlayerDriver(95):添加到调度器02-06 17:15:13.829:V/PlayerDriver(95):PendForExec 02-06 17:15:13.829: V/PlayerDriver(95):OsclActiveScheduler::当前02-06 17:15:13.829:V/PlayerDriver(95):StartScheduler 02-06 17:15:13.829:V/PVPlayer(95):发送播放器\u设置02-06 17:15:13.829: V/PlayerDriver(95):发送玩家代码:202-06 17:15:13.829: V/PlayerDriver(95):命令完成02-06 17:15:13.829: V/PlayerDriver(95):已完成命令播放器\设置状态=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):准备同步02-06 17:15:13.839: V/PVPlayer(95):数据源= file:///android_asset/www/audio/sound.mp3 02-06 17:15:13.849: V/PlayerDriver(95):发送玩家代码:302-0617: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):Handle信息事件: PVMFInfoErrorHandlingStart 02-06 17:15:13.849:V/PlayerDriver(95): HandleInformation事件:类型=26未处理02-06 17:15:13.849: W/MediaPlayer(4361):信息/警告(1,26)02-06 17:15:13.849: V/PlayerDriver(95):命令完成02-06 17:15:13.849: V/PlayerDriver(95):已完成的命令播放器设置数据源 状态=PVMFErrNotSupported 02-06 17:15:13.849:E/PlayerDriver(95): 命令播放器\u设置\u数据\u源已完成,但有错误或信息
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): HandleInformation事件:PVMFInfoErrorHandlingComplete 02-06 17:15:13.849:W/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):已完成 命令播放器\取消\所有\命令状态=PVMFSuccess 02-06 17:15:13.939:V/PlayerDriver(95):发送玩家代码:11 02-06 17:15:13.939:V/PlayerDriver(95):HandlerReset 02-06 17:15:13.939: V/PlayerDriver(95):命令完成02-06 17:15:13.939: V/PlayerDriver(95):已完成的命令播放器_重置状态=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):命令已完成02-06 17:15:13.939:V/PlayerDriver(95):完成命令 播放器\删除\数据\源状态=PVMFSuccess 02-06 17:15:13.939: V/PlayerDriver(95):删除数据源完成02-06 17:15:13.939: V/PVPlayer(95):取消映射文件


这取决于您的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>
,它适用于Android 2.3及以上版本。

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

Android MediaPlayer需要媒体文件具有全球可读性,因此它们不能驻留在Eclipse项目中的“资产”文件夹中。将音频/视频文件推送到设备外部存储器上。为此,使用仿真器,使用Eclipse中的DDMS透视图(当仿真器运行时,转到窗口->打开预期->其他->DDMS)创建文件夹,并将文件推送到SD卡映像或内部(不可移动)存储器上

关于DDMS的参考:

在DDMs中,在左侧的“设备”面板中选择emulator,然后选择右侧的“文件浏览器”选项卡,查找名为/mnt/sdcard/的文件夹,其中包含sdcard内容,或者为标准化应用程序的存储区域查找/Android/data/package_name/files/。因此,在上面的示例中,如果在SD卡上创建文件夹myaudio,则文件名路径为:

音频=新音频(“/mnt/sdcard/myaudio/sound.mp3”)

参考:


不要放弃HTML5

我也遇到了同样的问题,最后我使用phonegap和cordova,您可以轻松播放和录制音频:

谢谢您提供了另一种播放声音的方法,我以前从未尝试过。也感谢您提到PhoneGap库。它看起来很有趣,我要试试。我正在安卓2.3模拟器中测试。但是,即使是您的解决方案,其行为也是相同的。即使在JavaScript代码中相对指定了资产URI,资产URI也会正确地打印在日志中,所以我认为这不是问题所在。它在所有桌面浏览器中都运行得很好。目前为止没有任何帮助,所以我通过在本机代码中播放声音来解决这个问题。我稍后会关注问题的真正原因…太好了!非常感谢你的解释。不幸的是,这个解决方案对我来说似乎很老套。我不想用任何文件破坏用户的SD卡。也许将这些文件存储到应用程序的临时存储器会很好,但这不是一个世界可读的地方,对吗?此外,由于存在rel
<audio id="audio" src="" type="audio/mpeg" preload="metadata" ontimeupdate="timeUpdate()"
   ondurationchange="durationChange()" onerror="musicError()" onended="musicEnded()">
<embed src="" height=50 width=100></embed>