2013-03-14 99 views
0

我正在製作一個錄製音頻的示例程序。我有一個用於啓動和停止錄製的按鈕。我正在運行一個線程,以便我可以錄製到30 sec.My的問題是,在達到30秒前,如果我點擊stopButton,我的應用程序不幸停止。現在我沒有得到問題。 以下是我的代碼:無法停止音頻錄製,線程無法正常工作,並且應用程序不幸停止

public class AudioRecordingActivity extends Activity { 
private Button RecordButton; 
boolean recording; 
MediaRecorder recorder ; 
Thread RecordThread; 
Handler recordHandler; 
private TextView timeText; 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    timeText=(TextView)findViewById(R.id.textView1); 

    RecordButton=(Button)findViewById(R.id.btnRecord); 
    RecordButton.setText("Start Recording"); 
    RecordButton.getBackground().setColorFilter(new LightingColorFilter(-16711936, 0)); 
    recording=false; 
    RecordButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      if (recording) 
      { 

       recording=false; 

       stopRecording(); 
       RecordButton.setText("Start Recording"); 
       RecordButton.getBackground().setColorFilter(new LightingColorFilter(-16711936, 0)); 
      // Toast.makeText(getApplicationContext(), "Recording Stopped", Toast.LENGTH_LONG).show(); 



      }//if(recording) 
      else if(!recording) { 

       recording=true; 
       startRecording(); 
       RecordButton.setText("Stop Recording"); 
       RecordButton.getBackground().setColorFilter(new LightingColorFilter(-65536, 0)); 
      // Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show(); 

       recordHandler = new Handler(); 
        RecordThread=new Thread(new Runnable() { 
         int j; 
        @Override 
        public void run() { 
         // TODO Auto-generated method stub 

         for(j=30;j>=0;j--){ 
          if(recording){ 
           recordHandler.post(new Runnable() { 

            @Override 
            public void run() { 
             // TODO Auto-generated method stub 
            setTimer(j); 
            }//handler run 

           });//post 
           try { 
            Thread.sleep(1000); 
           } catch (InterruptedException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           }//catch 
          }else if (!recording) 
          { 
           stopRecording(); 

          } 
         }//for 
        }//run 

       }); 
       RecordThread.start(); 


      } 


     } 
    }); 


}//onCreate 
protected void startRecording() { 
    // TODO Auto-generated method stub 

    Random generator = new Random(); 
    int n = 1000; 
    n = generator.nextInt(n); 
    File folder = new File(Environment.getExternalStorageDirectory().toString()+"/AudioRecord"); 
     if(!folder.exists()) 
     { 
      folder.mkdirs(); 

     } 
     String path = Environment.getExternalStorageDirectory().getAbsolutePath() + 
      "/AudioRecord/audiorecord"+n+".3gp";     



    recorder = new MediaRecorder(); 
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    recorder.setOutputFile(path); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 

    Toast.makeText(getApplicationContext(),"Saving Audio as"+ path, 
      Toast.LENGTH_LONG).show(); 
     try { 
     recorder.prepare(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     Toast.makeText(getApplicationContext(), "IllegalStateException called", Toast.LENGTH_LONG).show(); 


    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     Toast.makeText(getApplicationContext(), "prepare() failed", Toast.LENGTH_LONG).show(); 

    } 

     recorder.start(); 


} 

private void stopRecording() { 

    recorder.stop(); 
    recorder.release(); 
    recorder = null; 


    } 

    private void setTimer(int j) { 
     // TODO Auto-generated method stub 
     ((TextView)findViewById(R.id.textView1)).setText(String.valueOf(j) + "sec"); 
     if(j==0){ 
      recording=false; 

     } 


    } 
}//class end 

音頻記錄perfectly.I想這個問題是停止音頻和thread.I不知道哪裏的修正將被製成。 謝謝提前幫忙。

+0

您可以張貼日誌中的錯誤嗎? – mach 2013-03-14 10:36:32

+0

我在手機上遇到錯誤..我的應用程序停止不幸,當我點擊停止按鈕時... – 2013-03-14 16:46:28

+0

如果您可以在問題發生時從電話中發佈日誌,這將非常有幫助。通過打開終端窗口並鍵入'adb logcat'來完成此操作。重現問題並複製粘貼窗口中的文本。 – mach 2013-03-18 06:23:35

回答

0

問題解決了:如下更正作了..

 @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      if (recording) 
      { 
       if(recorder!=null){ 
        recorder.stop(); 
        recorder.release(); 
        recorder = null; 
       } 

       recording=false; 
       RecordButton.setText("Start Recording"); 
       RecordButton.getBackground().setColorFilter(new LightingColorFilter(-16711936, 0)); 
      // Toast.makeText(getApplicationContext(), "Recording Stopped", Toast.LENGTH_LONG).show(); 



      } 

...

private void setTimer(int j) { 
     // TODO Auto-generated method stub 
     timeText.setText(String.valueOf(j) + "sec"); 
     if ((recording) && (j==1)){ 

       recorder.stop(); 
       recorder.release(); 
       recorder = null; 
       recording=false; 
       RecordButton.setText("Start Recording"); 
       RecordButton.getBackground().setColorFilter(new LightingColorFilter(-16711936, 0)); 

      } 





    }