2010-12-19 8 views
1

私は、非圧縮(wav形式)のオーディオを記録するアプリを作っています。私は実際にオーディオを録音するのにthis classを使用しています。現在のところ、私のアプリケーションは正常に記録されます(私はファイルを再生することができます)が、録画を停止するためにボタンをクリックすると、ログ出力や生命の兆候なしで10秒間アプリがハングします。最後に、それは丸くなり、ログにエラーのロードをダンプし、UIなどを更新します。私はAsyncTasksを使ってこのようなことを避けますが、動作しません。私のコードは次のとおりです:Androidアプリがハングアップする、強制終了/待機ダイアログが表示されるまで

//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では、私はいつも私に困ってしまったような出力を得ています。この出力は、ボタンをクリックして正しいstop()メソッド呼び出しのログ出力の後に発生します。

この出力は、RehearsalAudioRecorderクラスをログに記録しています。
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を交換しました、私はレコードをクリックすると、アプリが完全にログがメインスレッドで起こっている何もない示しという事実にもかかわらず、ハングアップします。まだ完全に困った。

+0

RehearsalAudioRecorderオブジェクトに問題がある可能性があります。コードを表示できますか? –

+0

質問のリンクをクリックしてください! – fredley

答えて

0

サービスを実行すると、UIロックアップが完全に削除されます。私は、RehearsalAudioプロジェクトでRecordServiceクラスを大幅に削除したバージョンを使用しました。これは、必須ではないセッションのすべてを取り除きました。

2

あなたはアプリケーションにRECORD_AUDIO権限を与えましたか?

また、RehearsalAudioRecorderのキャッチブロックを変更して、「updateListenerにエラーが発生しました。記録が中止されました」の代わりに実際の例外を記録する必要があります。

+0

はい、これは権限の問題ではありません。 updateListenerのエラーは、レコーダーが既に停止されているためです。なぜなら、何らかの理由でそのメソッドを呼び出すことが保たれているからです。 – fredley

0

Fredley、

この問題を解決する最も簡単な方法は、あなたonPeriodicotification IN aRecorderの状態をチェックすることです。あなたは文の場合は、次のすべてを入れ子にしてこれを行うことができます。


if (aRecord.getRecordingState() != RECORDSTATE_STOPPED) 
{ 
    // Your onPeriodicNotification code here... 
} 

注:audiorecordのオブジェクトは、必ずしもあなたの他のAsyncTasksに加えてねじ込まれているので、これが必要です。 AudioRecordオブジェクトからアクセスできないため、状態は不十分です。

ファジカル論理

P.S.また、aRecordオブジェクトをレコーダーの引数と照合して検証することもできます。彼らは同じ物と話すことを保証されていません。この特定のコードでは重要ではありませんが、将来的には知っておくとよいでしょう。

関連する問題