android - MediaPlayer:在使用Phaser 2.4.6的Cordova 6.1.1中出现错误(1,-2147483648)

标签 android cordova audio mobile phaser-framework

我正在尝试在使用Cordova 6.1.1和Phaser.io 2.4.6构建的Android游戏中播放音频文件。媒体无法在低于API 21左右的Android版本上播放,并显示错误消息

04-21 21:48:57.546 9659-9671/com.jtronlabs.birdu E/MediaPlayer: error (1, -2147483648)
04-21 21:48:57.546 9659-9672/com.jtronlabs.birdu E/MediaPlayer: Error (1,-2147483648)

我已经阅读了一些答案,但没有任何帮助。我使用Phaser的Loader类加载音频:
this.load.audio('background-music', this.arrayOfCompatibleMusicFileNames('the_plucked_bird') ); 

...
//Phaser has support to load in multiple types of audio formats if the first supplied in the array is not compatible with the browser.
arrayOfCompatibleMusicFileNames: function(key){
  //old versions of android don't play music, they require an absolute pathname (instead of relative). This is a generic solution
  //https://stackoverflow.com/questions/4438822/playing-local-sound-in-phonegap?lq=1
  var path = window.location.pathname;
  path = path.substr( 0, path.lastIndexOf("/")+1 ); //need to remove 'index.html' from the end of pathname
  var aud = path+'assets/audio/';

  //aud = '/android_res/raw/'
  var wav = aud + 'wav/';
  var ogg = aud + 'ogg/';
  var mp3 = aud + 'mp3/';

  console.log(mp3+key+".mp3");

  return [mp3+key+".mp3",ogg+key+".ogg",wav+key+".wav"];
},

在浏览器和新版本的Android上均可使用。在较旧的版本上,我尝试添加多个formatsabsolute path,将permissions外部写入$ PROJECT_ROOT / platforms / android / AndroidManifest.xml并将文件从/ www移动到$PROJECT_ROOT/platforms/android/res/raw

一无所有。关于可能出什么问题的任何想法?

编辑:当音频文件在'res'文件夹中时,我这样引用它们:
arrayOfCompatibleMusicFileNames: function(key){
  return ['/android_res/raw/'+key+".ogg"];
}

它适用于API 21,但不适用于19或更低版本(就像第一个函数一样)。

最佳答案

我已经使用cordova-plugin-media使音频工作了。

var path = window.location.pathname;
path = path.substr( 0, path.lastIndexOf("/")+1 ); //need to remove 'index.html' from the end of pathname
var aud = path+'assets/audio/';

var ogg = aud + 'ogg/' + key + ".ogg";

//works!
var snd = new Media(ogg);
snd.play();

但是,我发现执行此操作的“正常”方法是导致不良行为的原因。
//does not work... Phaser uses this internally
var snd = new Audio(ogg);
snd.play();

看来我将不得不编写代码来测试它是浏览器还是Cordova,并分别使用“媒体”或“音频”。

更新:我编写了该代码,它使事情变得混乱,但是可以工作。如今,我使用Crosswalk,并且WebAudio可在所有设备上使用。无需媒体插件和我的代码中的额外大小写检查。

关于android - MediaPlayer:在使用Phaser 2.4.6的Cordova 6.1.1中出现错误(1,-2147483648),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36783554/

相关文章:

javascript - ionic2 在寻址到正在运行的开发服务器时失败(ionic hello world)

Android 无缝音频循环

javascript - 如何检测音频在网页中播放完毕?

java - 如何从 Intent 对象android获取请求代码

android - 在 fragment 中使用 LocationListener

ios - 为什么Phonegap deviceready事件在很长一段时间后被触发?

android - 接收 RTP 流 - AudioStream, AudioGroup

java - Android:程序在设备上没有错误地关闭

android - react-native-firebase 无法处理通知 click_action 导航到通知屏幕

java - Android Phonegap 中的纬度经度跟踪?