【问题标题】:Play sound on Phonegap app for Android在 Android 的 Phonegap 应用上播放声音
【发布时间】:2014-03-19 19:01:00
【问题描述】:

我尝试播放一个 mp3 文件。如果我在本地网络服务器上更改文件的路径,则此方法有效,但如果我在 Android 设备上运行,则不会播放声音并且不会显示错误。

我很确定找不到 mp3 文件,但我仍然不知道如何修复它。

这是Html

  <body>

        <audio id="successSound" src="/android_asset/www/sound/successSound.mp3" type="audio/mpeg" ></audio>
           <audio id="errorSound" src="/android_asset/www/sound/errorSound.mp3" type="audio/mpeg" ></audio>
<!-- some more UI -->
  </body>

这是Javascript

document.getElementById('errorSound').play();

文件结构

phonyapp
`-- www
    `-- index.html
        |-- sound
        |   |-- errorSound.mp3
        |   `-- successSound.mp3
        |-- res
        `-- spec

编辑 1

我试过了

<audio id="successSound" src="sound/successSound.mp3" type="audio/mpeg" ></audio>

这在我的本地网络服务器上的 chrome 中有效,但在 Android 上无效。

我试过了

<audio id="successSound" src="http://html5multimedia.com/media/sayHello.mp3" type="audio/mpeg" ></audio>

这行得通,但我需要播放本地文件

【问题讨论】:

标签: android cordova


【解决方案1】:

HTML5 API 提供的播放方法对于播放网络上可用的媒体文件很有用。 Phonegap 提供媒体插件来播放本地媒体文件。我检查了您的代码并通过进行以下更改成功播放了声音。请在最后检查。

1.将以下行添加到config.xml

<gap:plugin name="org.apache.cordova.media" />

2.替换index.html中的行

<button onclick="document.getElementById('successSound').play()">Play successSound local</button>
<button onclick="document.getElementById('errorSound').play()">Play errorSound local</button>

这些行

<button onclick="playAudio('successSound')">Play successSound local</button>
<button onclick="playAudio('errorSound')">Play errorSoundlocal</button>

3.在js/index.js中添加如下函数

function playAudio(id) {
    var audioElement = document.getElementById(id);
    var url = audioElement.getAttribute('src');
    var my_media = new Media(url,
            // success callback
             function () { console.log("playAudio():Audio Success"); },
            // error callback
             function (err) { console.log("playAudio():Audio Error: " + err); }
    );
           // Play audio
    my_media.play();
}

【讨论】:

  • 使用 Media 对象也适用于我。
  • 您的解决方案有效,但我必须提供音频文件的绝对路径。谢谢
  • 工作,必须和netchi一样。这只是一个问题(不使用 HTML5 音频)
  • 打印错误时我们会得到[object object]。最好做 JSON.stringify(err)
【解决方案2】:

使用此代码

  <body>

    <audio id="successSound" src="file:///android_asset/www/sound/successSound.mp3"      type="audio/mpeg" ></audio>
       <audio id="errorSound" src="file///android_asset/www/sound/errorSound.mp3"   type="audio/mpeg" ></audio>
<!-- some more UI -->
 </body>

【讨论】:

  • iOS 呢?
【解决方案3】:

您是否尝试删除代码中的 /android_asset/www/ 部分?你的应用就像一个网站,它认为它的根是 www 文件夹本身。

编辑: 我会编辑评论。代码没有以某种方式显示。

【讨论】:

  • 试试这个:
【解决方案4】:

如果您使用的是本地文件,请尝试使用src="file:///yourpath/sayHello.mp3" 引用它们

【讨论】:

    【解决方案5】:

    我遇到了同样的问题,终于让它工作了,对我来说,问题在于我的媒体变量的范围。我得到它的工作如下:

    (function () {
    
        "use strict";
         var media;
         document.addEventListener('deviceready', onDeviceReady.bind(this), false);
    
    function onDeviceReady() {
        media = new Media("/android_asset/www/sounds/wat is je wens.mp3", null, function (e) {
        alert('Media Error');
        alert(JSON.stringify(e));
        });
    
        alert('deviceready')
    };
    function onStart() {
        media.play();
        alert('yay')
    
    }
    };
    

    基本上,我通过在 onDeviceReady 之外声明媒体变量的范围来确保它的范围是全局的,但在 deviceready 事件之前没有调用 Media。

    【讨论】:

      【解决方案6】:
      `` // Audio player
              //
              var my_media = null;
              var mediaTimer = null;
              // Play audio
              //
              function playAudio(src) {
                  // Create Media object from src
                  my_media = new Media(src, onSuccess, onError);
      
                  // Play audio
                  my_media.play();
      
                  // Update my_media position every second
                  if (mediaTimer == null) {
                      mediaTimer = setInterval(function() {
                          // get my_media position
                          my_media.getCurrentPosition(
                              // success callback
                              function(position) {
                                  if (position > -1) {
                                      setAudioPosition((position) + " sec");
                                  }
                              },
                              // error callback
                              function(e) {
                                  console.log("Error getting pos=" + e);
                                  setAudioPosition("Error: " + e);
                              }
                          );
                      }, 1000);
                  }
              }
              // onSuccess Callback
              //
              function onSuccess() {
                  console.log("playAudio():Audio Success");
              }
      function stopAudio() {
                  if (my_media) {
                      my_media.stop();
                  }
                  clearInterval(mediaTimer);
                  mediaTimer = null;
              }
              // onError Callback
              //
              function onError(error) {
              }
              // Set audio position
              //
              function setAudioPosition(position) {
                  document.getElementById('audio_position').innerHTML = position;
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-14
        相关资源
        最近更新 更多