如何使用html5音频标签在Android上使用phonegap播放本地mp3?

Mik*_*Kay 6 html5 android html5-audio cordova

我在Android 4.4上部署了带有Android SDK的v19的phonegap.我在我的index.html文件所在的文件夹中有一个mp3文件,我想用html5音频标签播放.

<html>
  <body>
  <audio controls>
    <source src='sound.mp3' type='audio/mpeg'>
  </audio>
  </body>
  <script type="text/javascript" src="cordova.js"></script>
</html>
Run Code Online (Sandbox Code Playgroud)

它不起作用,但失败如下:

I/AwesomePlayer(  124): setDataSource_l(URL suppressed)
E/        (  124): Failed to open file '/android_asset/www/sound.mp3'. (No such file or directory)
Run Code Online (Sandbox Code Playgroud)

它看起来像一个路径问题,但我已经尝试了我能想到的所有排列.我认为它更为基础,就像AwesomePlayer无法访问存储在android_asset目录中的mp3.

使用Media插件进行phonegap工作正常,因为其他答案已经建议,但由于音频标签适用于外部媒体,而Media插件适用于内部媒体,因此似乎应该可以轻松修复.我还有一个巨大的工作应用程序,在任何地方使用音频标签,我真的不想重写它使用媒体插件.是否有一个简单的明显修复,或者我应该提交错误报告?

Yev*_*nov 5

让我总结一下我从类似主题的各种问题/答案中找到的内容:

  • Android WebView中的音频标签有点破碎.所以是的,这是一个错误.
  • 使用音频标签播放本地文件在iOS和桌面浏览器上运行良好
  • 从SD卡播放本地文件适用于Android:

    <audio controls="controls">
       <source src="file:///sdcard/test.mp3" type="audio/mpeg"/> 
    </audio>
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您想要从Android设备播放文件,那么使用Media对象的当前实现是唯一的选择.

探索链接:


Mik*_*Kay 0

到目前为止,我唯一的解决方案是将音频标签动态重写为phonegap Media启用按钮。不是很好:

$("audio").replaceWith (option,element) ->  "
  <span class='audio' data-src='#{$(element).attr('src')}'>
    <button class='Play'>Play</button>
    <button style='display:none' class='Pause'>Pause</button>
    <button style='display:none' class='Reset'>Reset</button>
  </span>
"

$("span.audio").on "click", "button.Play", (event) ->
  audioTarget = $(event.target).parent()
  unless audioTarget.data("audio")?
    path = "/android_asset/www/#{audioTarget.attr("data-src")}"
    audioTarget.data("audio", new Media(path))
  audioTarget.data("audio").play()
  $(event.target).hide().siblings().show()

$("span.audio").on "click", "button.Pause", (event) ->
  $(event.target).parent().data("audio").pause()
  $(event.target).hide().siblings().show()

$("span.audio").on "click", "button.Reset", (event) ->
  $(event.target).parent().data("audio").seekTo(0)
  $(event.target).hide().siblings().show()
Run Code Online (Sandbox Code Playgroud)