我正在创建一个记录未压缩(wav格式)音频的应用。我正在使用this class来实际录制音频。目前,我的应用程序记录正常(我可以播放文件),但是当我点击按钮停止录制时,应用程序会挂起10秒左右,没有日志输出或任何生命迹象。最后它绕过,将大量错误转储到日志中,更新UI等。我正在使用AsyncTasks尝试避免这种事情,但它无法正常工作。这是我的代码:
//Called on clicks of the record button. rar is the instance of RehearsalAudioRecorder
private OnClickListener RecordListener = new OnClickListener(){
@Override
public void onClick(View v) {
Log.d("Record","Click");
if (recording){
new stopRecordingTask().execute(rar,null,null);
startStop.setText("Record");
statusBar.setText("Recording Finished, ready to Encode");
}else{
recording = true;
new startRecordingTask().execute(rar,null,null);
startStop.setText("Stop");
statusBar.setText("Recording Started");
}
}
};
private class startRecordingTask extends AsyncTask<RehearsalAudioRecorder,Void,Void>{
@Override
protected Void doInBackground(RehearsalAudioRecorder... rs) {
RehearsalAudioRecorder r = rs[0];
r.setOutputFile("/sdcard/rarOut.wav");
r.prepare();
r.start();
return null;
}
}
private class stopRecordingTask extends AsyncTask<RehearsalAudioRecorder,Void,Void>{
@Override
protected Void doInBackground(RehearsalAudioRecorder... rs) {
RehearsalAudioRecorder r = rs[0];
r.stop();
r.reset();
return null;
}
}
在Logcat中,我总是得到这样的输出,这让我很难过。我不知道是什么导致了它(我正在记录RehearsalAudioRecorder类,并且按钮点击正确启动/停止。此输出发生在按钮单击的日志输出和正确的stop()方法调用之后)
12-19 11:59:11.172: ERROR/AudioRecord-JNI(22662): Unable to retrieve AudioRecord object, can't record
12-19 11:59:11.172: ERROR/uk.ac.cam.tfmw2.steg.RehearsalAudioRecorder(22662): Error occured in updateListener, recording is aborted
12-19 11:59:11.172: ERROR/uk.ac.cam.tfmw2.steg.RehearsalAudioRecorder(22662): stop() called on illegal state: STOPPED
12-19 11:59:11.172: ERROR/AudioRecord-JNI(22662): Unable to retrieve AudioRecord object, can't record
12-19 11:59:11.172: ERROR/uk.ac.cam.tfmw2.steg.RehearsalAudioRecorder(22662): Error occured in updateListener, recording is aborted
12-19 11:59:11.172: ERROR/uk.ac.cam.tfmw2.steg.RehearsalAudioRecorder(22662): stop() called on illegal state: ERROR
12-19 11:59:11.172: ERROR/AudioRecord-JNI(22662): Unable to retrieve AudioRecord object, can't record
12-19 11:59:11.172: ERROR/uk.ac.cam.tfmw2.steg.RehearsalAudioRecorder(22662): Error occured in updateListener, recording is aborted
12-19 11:59:11.172: ERROR/uk.ac.cam.tfmw2.steg.RehearsalAudioRecorder(22662): stop() called on illegal state: ERROR
... 10 or more times
我整天都在摆弄这一切,而且我没有到达任何地方,任何意见都会受到高度赞赏。
更新 我用线程替换了AsyncTasks,仍然不起作用,当我点击记录时应用程序完全挂起,尽管事实上Log表明主线程中没有任何内容。仍然完全难倒。
答案 0 :(得分:2)
您是否已获得应用程序RECORD_AUDIO权限?
您还应该更改RehearsalAudioRecorder中的catch-block以记录真正的异常,而不仅仅是“updateListener中出现错误,记录已中止”,因为它现在记录。
答案 1 :(得分:0)
Fredley,
解决此问题的最简单方法是检查onPeriodicotification中aRecorder的状态。您可以通过在以下if语句中嵌套所有内容来完成此操作:
if (aRecord.getRecordingState() != RECORDSTATE_STOPPED)
{
// Your onPeriodicNotification code here...
}
注意:这是必要的,因为除了其他AsyncTasks之外,AudioRecord对象必须是线程化的。您的状态根本不够,因为AudioRecord对象无法访问它。
模糊逻辑
P.S。您也可以根据记录器参数验证aRecord对象。他们没有保证与同一个对象交谈。对于这个特定的代码并不重要,但对未来很有帮助。
答案 2 :(得分:0)
将其置于服务中,完全摆脱了UI锁定。我在RehearsalAudio项目中使用了一个严重剥离的RecordService类版本,删除了所有不需要的会话内容。