2016-09-04 4 views
0

모두Android : 오디오 앱 충돌 사고

간단한 오디오 녹음을하려고합니다.

녹음 버튼을 클릭하면 오디오가 완벽하게 녹음됩니다.

다른 오디오를 녹음하고 다시 재생하려고합니다. 두 번째 오디오를 재생하려고하면 충돌이 발생합니다.

이 응용 프로그램을 수정하지 않고도 오디오를 여러 번 녹음 할 수 있도록 도와주세요.

다음은 코드입니다.

stop.setEnabled(false); 
    play.setEnabled(false); 
    outputFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/recording.3gp";; 

    myAudioRecorder=new MediaRecorder(); 
    myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB); 
    myAudioRecorder.setOutputFile(outputFile); 

    record.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     try { 
      myAudioRecorder.prepare(); 
      myAudioRecorder.start(); 
     } 


     catch (IllegalStateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     record.setEnabled(false); 
     stop.setEnabled(true); 

     Toast.makeText(getApplicationContext(), "Recording started", Toast.LENGTH_LONG).show(); 
    } 
    }); 

    stop.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     myAudioRecorder.stop(); 
     myAudioRecorder.reset(); 

     record.setEnabled(true); 
     stop.setEnabled(false); 
     play.setEnabled(true); 

     Toast.makeText(getApplicationContext(), "Audio recorded successfully",Toast.LENGTH_LONG).show(); 
    } 
    }); 

play.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) throws IllegalArgumentException,SecurityException,IllegalStateException { 
     MediaPlayer m = new MediaPlayer(); 

     try { 
      m.setDataSource(outputFile); 
     } 

     catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      m.prepare(); 
     } 

     catch (IOException e) { 
      e.printStackTrace(); 
     } 

     m.start(); 
     Toast.makeText(getApplicationContext(), "Playing audio", Toast.LENGTH_LONG).show(); 
    } 
    }); 

고마워요!

답변

1

중지 버튼을 클릭하면 녹음 버튼을 활성화하지 않는 것 같습니다. onClick() 메서드에서 stop 버튼을 구현할 때

record.setEnabled(true); 

을 입력하십시오.

또 다른 경우는 중지 버튼을 클릭하면 myAudioRecorder = null으로 설정됩니다. 이 레코드 버튼을 클릭 한 후이 문에 NullPointerException이 얻을 것이다 경우

myAudioRecorder.prepare() //exception 

솔루션의 onclick() 정지의 구현에 null로 설정 myAudioRecorder의 문을 제거하는 것입니다.

이 문은 myAudioRecorder.release()으로 인해 또 다른 문제가 발생합니다. 리소스를 해제 한 후에는 MediaRecorder의 이전 인스턴스를 되돌릴 수 없습니다. 중지를 클릭 한 후에 자원을 기록하거나 해제하지 않을 때마다 myAudioRecorder을 다시 초기화하십시오. 살펴보기 MediaRecorder 생명주기 see this.

다음은보고 이해할 수있는 참조 코드입니다. 필요한 경우 예외를 잡으십시오.

//package name 
//imports 
public class RecordPlayActivity extends AppCompatActivity implements View.OnClickListener { 
// declare buttons here 
private MediaRecorder myAudioRecorder; 
private String recordOutputFile; 
private MediaPlayer mediaPlayer; 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(null); 
    setContentView(R.layout.layout_name); 
    //find buttons view by Id here 
    record.setOnClickListener(this); 
    stop.setOnClickListener(this); 
    play.setOnClickListener(this); 
    recordOutputFile = Environment.getExternalStorageDirectory().getAbsolutePath() + "/recording.3gp"; 
    myAudioRecorder = new MediaRecorder(); 
    myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB); 
    myAudioRecorder.setOutputFile(recordOutputFile); 
    mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setDataSource(recordOutputFile); 
    //Initial condition 
    //stop.setEnabled(false); //not required as stop can be made always enabled 
    play.setEnabled(false); 
} 

@Override 
public void onClick(View view){ 
    switch(view.getId()){ 
     case R.id.idForRecord: 
      myAudioRecorder.prepare(); 
      myAudioRecorder.start(); 
      //Recording started 
      record.setEnabled(false); 
      // don't make play enabled cause you dont want to play 
      // and record at same time without stopping record. 
      play.setEnabled(false); //required because play can get enabled from stop but it should not remain when recording 
      break; 
     case R.id.idForStop: 
      //if clicked after record 
      myAudioRecorder.stop(); 
      myAudioRecorder.reset(); 
      //if clicked after play 
      if(mediaPlayer.isLooping()) { 
       mediaPlayer.stop(); 
      } 
      //recording stopped and saved; 
      record.setEnabled(true); 
      play.setEnabled(true); 
      break; 
     case R.id.idForPlay: 
      mediaPlayer.prepare(); 
      mediaPlayer.start(); 
      //playing 
      record.setEnabled(false); // you dont wanna play and record at same time 
      break; 
     default: 
    } 
} 

은}`

희망은이 모든 문제를 해결한다.

+0

버튼이 활성화되어 있지만 작동하지 않습니다. @GauravChauhan –

+0

@Mint 중지 후 레코드를 클릭하면 nullpointerexception 또는 App 크래시가 발생합니까? –

+0

null 문을 제거해도 앱이 다운됩니다. @ GauravChauhan –