2011-07-30 3 views
0

MediaRecorder에 이상한 문제가 있습니다. 그것은 음성 녹음, 녹음과 파일을 만듭니다. 하지만 stop() 메서드를 사용하여 녹음을 중지하려면 IllegalStateException을 발생시킵니다. 일반적으로 setMaxDuration() 메서드를 사용 했으므로 일반적으로 OnInfoListener를 사용하여 녹음을 끝내고 제대로 작동합니다. 그러나 ImageView의 OnTouchListener에서 MediaRecorder를 중지하고 싶습니다. 내 코드는 여기에 있습니다 :MediaRecorder는 파일을 기록하고 생성하지만 예외를 throw합니다.

내가 코드 recorder.stop으로 라인 (에서 나는 치명적인 예외 java.lang.IllegalStateException를 가지고있는 이미지 뷰를 만진
private static String OUTPUT_FILE; 

private void prepareRecording() throws Exception {  
    OUTPUT_FILE = "/sdcard/temp.3gpp";  
    File outFile = new File(OUTPUT_FILE); 

    if (outFile.exists()) 
     outFile.delete();  

    recorder = new MediaRecorder(); 
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    recorder.setOutputFile(OUTPUT_FILE); 
    recorder.setMaxDuration(10000); 
    try { 
     recorder.prepare(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    }  
    recorder.start();  
} 

private void startRecording() { 
    ImageView image = (ImageView) this.findViewById(R.id.image); 

    image.post(new Runnable() { 
    @Override 
    public void run() { 
     try { 
       prepareRecording(); 
      } catch (Exception e) { 
       e.printStackTrace();      
      } 

     image.setOnTouchListener(new OnTouchListener() { 

      public boolean onTouch(View v, MotionEvent event) { 
       if (recorder != null) 
        recorder.stop(); 
       return true; 
      } 
     }); 

     recorder.setOnInfoListener(new OnInfoListener() { 

      @Override 
      public void onInfo(MediaRecorder mr, int what, int extra) {      
       if (recorder != null && what == 800){ 
        recorder.stop();        
       }      
      } 
     });  

    }}); 
    } 

). 코드를 테스트 한 결과 MediaRecorder가 시작되지 않은 것 같습니다. 따라서 나는 recorder.stop()에서 IllegalStateException을 가진다. 그러나 녹음이 중지되면 내 sdcard 녹음 파일에서 찾을 수 있습니다. 내 코드에 무슨 문제가 있습니까?

내 이미지에 연결된 애니메이션도 가능합니다. 제대로 작동합니다.

답변

1

문제점을 해결했습니다. eceptions을 피하려면 onTouch 메소드에서 새 스레드를 시작해야합니다.

image.setOnTouchListener(new OnTouchListener() { 

    public boolean onTouch(View v, MotionEvent event) { 
     Thread thread = new Thread(){ 
     public void run(){        
       if (recorder != null)         
        recorder.stop(); 
     } 
    }; 
    thread.start();        
    return false; 
    } 
}); 
관련 문제