在Meteor-Cordova App中播放声音

时间:2014-12-11 21:18:54

标签: cordova meteor

使用没有cordova的流星我可以使用

在我的浏览器中播放声音
 new Audio('test.mp3').play()

其中test.mp3位于公用文件夹中。但是,一旦我将应用程序作为设备上的cordova应用程序运行,我就无法播放声音。我究竟做错了什么?谢谢。

5 个答案:

答案 0 :(得分:6)

TL;博士

  1. 安装cordova媒体插件meteor add cordova:org.apache.cordova.media@0.2.15

  2. 将音频文件添加到公共目录

  3. 使用/android_asset/www/application/path/to/sound.wav

  4. 如果查看项目中的此文件夹,

    $PROJECT_ROOT/.meteor/local/cordova-build/platforms/android/assets/www/

    您将看到您的应用程序为cordova为Android构建它。

    使用Cordova Media插件,我试图使用文件路径/android_asset/www/path/to/sound.wav无效。

    # Install the cordova media plugin with this command
    meteor add cordova:org.apache.cordova.media@0.2.15
    

    相反,我看到我的声音文件夹在www目录中但在应用程序目录下。所以,这个文件路径最终为我工作,

    /android_asset/www/application/path/to/sound.wav

    以下是适用于我的相关代码。

    function getMediaUrl(sound) {
    
      if (device.platform.toLowerCase() === "android") {
    
        return cordova.file.applicationDirectory.replace('file://', '') + 'www/application/' + sound.substr(1);
    
      }
      else {
    
        return cordova.file.applicationDirectory.replace('file://', '') + sound.substr(1);
    
      }
    
    }
    
    function playSound(sound) {
    
      return new Media(
    
        getMediaUrl(sound),
    
        function (success) {
          // success
        },
        function (err) {
          // error
        }
      );
    }
    
    var test = playSound('/sounds/test.wav');
    
    test.play();
    

    注意:我将我的音频文件包含在公共文件夹中,即

    $PROJECT_ROOT/public/sounds/test.wav

    在Android上,此文件路径已转换为

    /android_asset/www/application/sounds/test.wav

答案 1 :(得分:2)

似乎有两种可能的解决方案。第一个可能是更正确的解决方案仅适用于cordova应用程序。由于插件依赖性,它无法在浏览器中运行。第一步是添加cordova插件:

  meteor add cordova:org.apache.cordova.media@0.2.15 

接下来构建一个播放声音的功能:

playLimitSound = function() {
  if (Meteor.isCordova) {
        var my_media = new Media('http://MY_IP:port/test.mp3',
            // success callback
            function () {
                console.log("playAudio():Audio Success");
            },
            // error callback
            function (err) {
                console.log("playAudio():Audio Error: " + err);
            }
        );
        // Play audio
        my_media.play();
}

};

这是另一种解决方案。它适用于浏览器和cordova-app。

 new Audio('http://MY_IP:port/test.mp3').play()

答案 2 :(得分:1)

iOS推送通知声音有类似的问题。在Xcode编译应用程序之前,我将声音文件添加到Xcode中的Resources文件夹时解决了问题。在这种情况下,您可以将其称为:

if (Meteor.isCordova) {
  var NotificationHandler = function(evt) {
    if (evt.sound) {
      var snd = new Media( 
        Meteor.absoluteUrl(evt.sound), 
        function() { console.log('media ok'); }, 
        function(err) { console.log('media error',err); }
      );
      snd.play();
    }
  };
}

其中evt.sound是例如' test.mp3'

我安装了媒体插件

 meteor add cordova:org.apache.cordova.media@0.2.14

答案 3 :(得分:1)

如果您真的想在本地播放声音(没有互联网连接),那么您需要将主机地址更改为:

http://meteor.local/[your_subfolder(s)_if_you_got]/your.mp3

使用此URL,您当然可以执行上述媒体或音频呼叫。如果您的资源位于公共文件夹或资源文件夹中,那么您可以按照设计将这些文件复制到您的应用包中。

答案 4 :(得分:1)

我无法以任何形式或形式获得任何提议的Android解决方案。在Android上,我的应用程序在尝试播放声音时会无声地失败。

最后,这对我有用:

        var player = new window.Audio();

        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
                player.src = window.URL.createObjectURL(this.response);
                player.play();
            }
        };
        xhr.open('GET', "/audio.mp3");
        xhr.responseType = 'blob';
        xhr.send();

来自here