无法使用phonegap 2.4在android上播放录音

无法使用phonegap 2.4在android上播放录音,android,cordova,audio-recording,Android,Cordova,Audio Recording,我正在尝试使用phonegap中的媒体对象录制音频文件,然后播放它。我录音没有问题,但当我尝试播放时,我的应用程序关闭了,无论是在我的模拟器上还是在我的设备上。在logcat上显示:“org.apache.cordova.readyPlayer(AudioPlayer.java)上的空指针异常”。非常感谢任何愿意帮助我的人,我花了一段时间才意识到我在这里完全迷路了。 下面是我从中复制的代码,并在.stopRecord()之后添加了.play()。如果需要,我可以添加清单和活动,我怀疑问题是否存在

我正在尝试使用phonegap中的媒体对象录制音频文件,然后播放它。我录音没有问题,但当我尝试播放时,我的应用程序关闭了,无论是在我的模拟器上还是在我的设备上。在logcat上显示:“org.apache.cordova.readyPlayer(AudioPlayer.java)上的空指针异常”。非常感谢任何愿意帮助我的人,我花了一段时间才意识到我在这里完全迷路了。 下面是我从中复制的代码,并在.stopRecord()之后添加了.play()。如果需要,我可以添加清单和活动,我怀疑问题是否存在,但我可能错了。 index.html:

<script type="text/javascript" charset="utf-8" src="cordova-2.4.0.js"></script>
<script type="text/javascript" charset="utf-8">

// Wait for Cordova to load
//
document.addEventListener("deviceready", onDeviceReady, false);

// Record audio
// 
function recordAudio() {
    var src = "myrecording.amr";
    var mediaRec = new Media(src, onSuccess, onError);

    // Record audio
    mediaRec.startRecord();

    // Stop recording after 10 sec
    var recTime = 0;
    var recInterval = setInterval(function() {
        recTime = recTime + 1;
        setAudioPosition(recTime + " sec");
        if (recTime >= 10) {
            clearInterval(recInterval);
            mediaRec.stopRecord();
            document.getElementById('audio_position').innerHTML = "finished";
            **mediaRec.play();**
        }
    }, 1000);
}

// Cordova is ready
//
function onDeviceReady() {
    recordAudio();
}

// onSuccess Callback
//
function onSuccess() {
    console.log("recordAudio():Audio Success");
}

// onError Callback 
//
function onError(error) {
    alert('code: '    + error.code    + '\n' + 
          'message: ' + error.message + '\n');
}

// Set audio position
// 
function setAudioPosition(position) {
    document.getElementById('audio_position').innerHTML = position;
}

</script>

//等待Cordova加载
//
文件。添加的监听器(“deviceready”,OnDeviceraddy,false);
//录音
// 
函数recordAudio(){
var src=“myrecording.amr”;
var mediaRec=新媒体(src、onSuccess、onError);
//录音
mediaRec.startRecord();
//10秒后停止录制
var-recTime=0;
var recInterval=setInterval(函数(){
recTime=recTime+1;
设置音频位置(矩形时间+秒);
如果(矩形时间>=10){
清除间隔(再间隔);
mediaRec.stopRecord();
document.getElementById('audio_position').innerHTML=“finished”;
**mediaRec.play()**
}
}, 1000);
}
//科尔多瓦准备好了
//
函数ondevicerady(){
录制音频();
}
//onSuccess回调
//
函数onSuccess(){
log(“recordAudio():Audio Success”);
}
//错误回调
//
函数onError(错误){
警报('code:'+error.code+'\n'+
'消息:'+error.message+'\n');
}
//设置音频位置
// 
功能设置音频位置(位置){
document.getElementById('audio_position')。innerHTML=position;
}

录制音频


yuval

我发现Cordova 3.5(带有媒体插件0.2.11)和Android 4.4也存在同样的问题。解决方案如上所述。基本上,像这样的东西应该可以做到:

mediaRec.stopRecord();
src = mediaRec.src;  // if you don't have src defined anymore
mediaRec.release();

mediaPlay = new Media(src, onSuccess, onError);
mediaPlay.play();

我发现Cordova3.5(带有媒体插件0.2.11)和Android 4.4也存在同样的问题。解决方案如上所述。基本上,像这样的东西应该可以做到:

mediaRec.stopRecord();
src = mediaRec.src;  // if you don't have src defined anymore
mediaRec.release();

mediaPlay = new Media(src, onSuccess, onError);
mediaPlay.play();

无需创建其他媒体对象来播放先前录制的文件。只需执行以下操作-您必须在停止录制后释放媒体对象:

//全局范围内的变量
var-mediaRec=0;
//用于录制音频的函数
函数recordAudio(){
//为录制创建媒体对象
mediaRec=新媒体(“phonegap_rec.amr”、onMediaRecordSuccess、onMediaRecordError);
//开始录音
mediaRec.startRecord();
//录制5秒
var-recTime=0;
var recInterval=setInterval(函数(){
recTime=recTime+1;
如果(矩形时间>=5){
清除间隔(再间隔);
//5秒后停止录制
mediaRec.stopRecord();
//释放媒体对象(这是这里的关键解决方案)
mediaRec.release();
}
}, 1000);
}
//播放录制音频的功能
函数playRecord(){
//检查对象是否存在
国际单项体育联合会(mediaRec){
//现在你可以播放录音了
mediaRec.play();
}

}
无需创建其他媒体对象来播放先前录制的文件。只需执行以下操作-您必须在停止录制后释放媒体对象:

//全局范围内的变量
var-mediaRec=0;
//用于录制音频的函数
函数recordAudio(){
//为录制创建媒体对象
mediaRec=新媒体(“phonegap_rec.amr”、onMediaRecordSuccess、onMediaRecordError);
//开始录音
mediaRec.startRecord();
//录制5秒
var-recTime=0;
var recInterval=setInterval(函数(){
recTime=recTime+1;
如果(矩形时间>=5){
清除间隔(再间隔);
//5秒后停止录制
mediaRec.stopRecord();
//释放媒体对象(这是这里的关键解决方案)
mediaRec.release();
}
}, 1000);
}
//播放录制音频的功能
函数playRecord(){
//检查对象是否存在
国际单项体育联合会(mediaRec){
//现在你可以播放录音了
mediaRec.play();
}

}
如果您在停止录制后删除mediaRec对象,使用相同的url创建一个新的媒体对象并尝试播放该对象,该怎么办?事实上,五分钟前我就知道了,然后我看到了您的屏幕。这是正确的。无论如何,非常感谢你,下一次我不会在问之前花这么长时间来解决这个问题,你本可以为我节省很多时间:)@user2033402我目前正在处理这个问题,你能发布你的解决方案吗。我使用的是phonegap 3.0,但语法是一样的。我们到底为什么要删除mediaRec对象并创建一个新对象呢?如果在停止录制后删除mediaRec对象,创建一个具有相同url的新媒体对象并尝试播放它呢?事实上,五分钟前我就知道了,然后我看到了你的视频。这是正确的。无论如何,非常感谢你,下一次我不会在问之前花这么长时间来解决这个问题,你本可以为我节省很多时间:)@user2033402我目前正在处理这个问题,你能发布你的解决方案吗。我使用的是phonegap 3.0,但语法是一样的。究竟为什么我们需要删除mediaRec对象并创建一个新对象嘿,你知道如何做同样的事情,但在录制后用另一个功能播放媒体吗。我试图将src作为参数传递给函数,但录制的音频没有播放,即使我使用完整的本地路径。我也试过这个问题的另一个答案,但仍然不起作用。嘿,你知道如何做同样的事情,但用另一个f播放媒体吗