【问题标题】:Android phone does not produce sound using cordova phone plugin & does not give error messageAndroid 手机使用 cordova 手机插件不产生声音并且不给出错误消息
【发布时间】:2016-09-05 10:16:56
【问题描述】:

我正在使用 ionic 框架来创建应用程序。我想播放声音,所以我使用了https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-media/ . 这是我用来播放声音的一段代码:

var my_media = new Media('/android/assets/www/audio/National Anthem.mp3',
        // success callback
        function () { console.log("playAudio():Audio Success"); },
        // error callback
        function (err) {console.dir("playAudio():Audio Error: " + err); }
    );
     my_media.play(); 

不幸的是它没有播放,给出的错误信息是:

playAudio():Audio Error: [object Object]

我无法在 chrome 控制台上查看对象!

如果我将var my_media = new Media(.. 替换为var my_media =$cordovaMedia.newMedia(...,我在控制台上根本不会收到任何消息。我的代码放在$ionicPlatform.ready(function()..,所以我确定插件在使用之前已经准备好了。有什么建议吗?

【问题讨论】:

  • 您能否在以下链接中试用这个基于非离子的示例工作应用程序 - github.com/gandhirajan/Cordova_Media
  • 我正在寻找直接的解决方案,而不是创造新事物,谢谢

标签: android cordova ionic-framework cordova-plugins


【解决方案1】:

所以我的媒体播放器解决方案如下:

首先,创建一个服务:

.factory('MediaSrv', function($q, $ionicPlatform, $window){
  var service = {
    loadMedia: loadMedia,
    getStatusMessage: getStatusMessage,
    getErrorMessage: getErrorMessage
  };

  function loadMedia(src, onError, onStatus, onStop){
    var defer = $q.defer();
    $ionicPlatform.ready(function(){
      var mediaSuccess = function(){
        if(onStop){onStop();}
      };
      var mediaError = function(err){
        _logError(src, err);
        if(onError){onError(err);}
      };
      var mediaStatus = function(status){
        if(onStatus){onStatus(status);}
      };

      if($ionicPlatform.is('android')){src = '/android_asset/www/' + src;}
      defer.resolve(new $window.Media(src, mediaSuccess, mediaError,    mediaStatus));
    });
    return defer.promise;
  }

  function _logError(src, err){
    console.error('media error', {
      code: err.code,
      message: getErrorMessage(err.code)
    });
  }

  function getStatusMessage(status){
    if(status === 0){return 'Media.MEDIA_NONE';}
    else if(status === 1){return 'Media.MEDIA_STARTING';}
    else if(status === 2){return 'Media.MEDIA_RUNNING';}
    else if(status === 3){return 'Media.MEDIA_PAUSED';}
    else if(status === 4){return 'Media.MEDIA_STOPPED';}
    else {return 'Unknown status <'+status+'>';}
  }

  function getErrorMessage(code){
    if(code === 1){return 'MediaError.MEDIA_ERR_ABORTED';}
    else if(code === 2){return 'MediaError.MEDIA_ERR_NETWORK';}
    else if(code === 3){return 'MediaError.MEDIA_ERR_DECODE';}
    else if(code === 4){return 'MediaError.MEDIA_ERR_NONE_SUPPORTED';}
    else {return 'Unknown code <'+code+'>';}
 }

  return service;
})

然后,在控制器中:

.controller('phrasebookCtrl', function ($scope, $ionicPlatform, $timeout,    $cordovaMedia,MediaSrv) { 

    $scope.play = function(src){
    MediaSrv.loadMedia(src).then(function(media){
    media.play();
});

在你看来(点击测试我):

 <p>Welcome: <a  ng-click="play('audio/welcome1_el.mp3')">Test me</a></p>

注意:此解决方案适用于 Android 和 iOS 平台。此外,您必须在项目的 www 文件夹中创建一个名为 audio 的文件夹,其中包含 .mp3 文件。

如果这解决了您的问题,请告诉我。

【讨论】:

  • 你是个天才:)
  • 很高兴知道此解决方案对您有所帮助! :) :)
【解决方案2】:

注意:cdvfile 路径支持作为 src 参数:

var my_media = new Media('cdvfile://localhost/temporary/recording.mp3', ...);

请按此设置路径。

【讨论】:

  • 您能否向我解释一下 cdvfile 路径的含义以及如果我需要使用它,我的路径会是什么样子?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2011-04-13
  • 2020-12-03
相关资源
最近更新 更多