Media Player
в приведенной ниже блок-схеме , stop()
допустимыми состояниями являются {Prepared, Started, Stopped, Paused, PlaybackCompleted}
. другие состояния (Idle, Initialized, Error) являются NOT действительными состояниями для вызова stop()
. в противном случае, IllegalStateException
брошено.
Поэтому для Ensure мы должны установить состояния listeners для MediaPlayer . Поскольку состояние Prepared
инициализируется раньше, чем setOnPreparedListener
для player
, мы можем безопасно остановить игрока.
...
boolean isPrepared = false;
...
recorder.setOnPreparedListener ....
{
...
isPrepared = true;
...
}
...
private void stopRecording() {
if(isPrepared){
player.stop();
...
}
}
Я сделал код, обобщенный для лучшего понимания.
Media Recorder
в приведенной ниже блок-схеме , stop()
доступен, только если вы находитесь в состоянии записи. в противном случае, вызывая stop()
throws IllegalStateException
.
, чтобы безопасно остановить или освободить ресурсы, связанные с рекордером, мы должны убедиться, что рекордер был
recorder.start(); // Recording is now started
для вашего указанного c кода
boolean isRecording = false;
private void startRecording() {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setOutputFile(fileName);
System.out.println(fileName);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
recorder.prepare();
recorder.start();
isRecording = true;
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
//e.printStackTrace();
}
}
....
private void stopRecording() {
if(isRecording){
recorder.stop();
}
recorder.reset(); // You can reuse the object by going back to setAudioSource() step
recorder.release(); // Now the object cannot be reused
isRecording = false;
}
если мы находимся в состоянии записи, остановите его, затем отпустите, в противном случае просто отпустите.