从JavaScript中播放WebView中的声音

时间:2012-02-06 14:56:13

标签: 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");

我尝试了以下方法的所有组合,如何使用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为<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');

虽然这个问题可能被认为是重复的 Android WebView playing audio with 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 ::当前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 / 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):数据源=   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:   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):完成命令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):错误   (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: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):错误(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 status = PVMFSuccess 02-06 17:15:13.939:   V / PlayerDriver(95):删除数据源完成02-06 17:15:13.939:   V / PVPlayer(95):取消映射文件

3 个答案:

答案 0 :(得分:7)

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

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

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

在DDM中,在左侧的“设备”面板中选择您的模拟器,然后选择右侧的FileExplorer选项卡,查找名为/ mnt / sdcard /的文件夹,其中包含SDCard内容,或者/ / / data / 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!

答案 1 :(得分:2)

我遇到了同样的问题,最后我正在使用phonegap和cordova,您可以轻松地播放和录制音频: http://docs.phonegap.com/en/2.9.0/cordova_media_media.md.html

答案 2 :(得分: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版本都没有Audio标签元素。正如您所见here,它适用于Android 2.3及更高版本。