【问题标题】:Playing sound in WebView from JavaScript从 JavaScript 在 WebView 中播放声音
【发布时间】:2012-02-06 14:56:13
【问题描述】:

我正在尝试从资产加载到 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 从未被调用,我试图在这里更准确地指定这个问题。

您是否知道可能出了什么问题或如何找出问题所在?

谢谢。

编辑:在 Galaxy 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):命令已完成 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): 准备异步 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): 处理信息事件:类型 = 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):已完成命令 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): 处理信息事件: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):已完成 命令 PLAYER_CANCEL_ALL_COMMANDS 状态=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):命令已完成 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):命令已完成 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): 取消映射文件

【问题讨论】:

标签: javascript android webview audio


【解决方案1】:

回复: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 中,在左侧的 Devices 面板中选择您的模拟器,然后选择右侧的 FileExplorer 选项卡,查找名为 /mnt/sdcard/ 的文件夹,其中包含 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!

【讨论】:

  • 太棒了!非常感谢您的解释。不幸的是,这个解决方案对我来说似乎很老套。我不想用任何文件破坏用户的 SD 卡。也许将这些文件存储到应用程序的临时存储区会很好,但这不是世界可读的地方,对吧?此外,由于整个项目中都有声音的相关链接,因此我也需要提取 HTML 和 JS 文件,而我也不想这样做。我现在可以用原生调用播放声音了。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这取决于您的 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 及更高版本。

    【讨论】:

    • 感谢您以另一种方式播放我以前从未尝试过的声音。还要感谢您提到 PhoneGap 库。这似乎很有趣,我会尝试一下。我正在 Android 2.3 模拟器中进行测试。但即使您的解决方案表现相同。
    • 资产 URI 会在日志中正确打印,即使它是在 JavaScript 代码中相对指定的,所以我认为这不是问题所在。它在所有桌面浏览器中也能正常工作。
    • 到目前为止没有任何帮助,所以我通过在本机代码中播放声音解决了这个问题。稍后我将重点介绍问题的真正原因......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2021-12-22
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多