Во второй раз, когда я нажимаю кнопку записи, мое приложение падает - PullRequest
0 голосов
/ 02 мая 2018

Это мой фрагмент кода.

private fun record() {                                                          

    recorder.setAudioSource(MediaRecorder.AudioSource.MIC)                      
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP)              
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB)                
    val path: File = filesDir                                                  
    try {                                                                      
        tempFile = File.createTempFile("audioTemp", ".3gp", path)              
    } catch (e: IOException) {                                                  
        Log.d("recording error", "recording error:", e)                        
    } catch (e: FileAlreadyExistsException) {                                  
        Log.d("File already Exist", e.toString())                              
    }                                                                          

    recorder.setOutputFile(tempFile?.absolutePath)                              
    try {                                                                      
        recorder.prepare()                                                      
    } catch (e: IOException) {                                                  
        Log.d("recording error", "recording error:", e)                        
    }                                                                          
    recorder.start()                                                            
}                                                                              

private fun stopRecord() {                                                      
    recorder.stop()                                                            
    recorder.release()                                                          
    button_play_sample.isEnabled = true                                        
    button_record.isEnabled = true                                              
    player.setOnCompletionListener(this)                                        
    try {                                                                      
        player.setDataSource(tempFile?.absolutePath)                            
    } catch (e: IOException) {                                                  
        Log.d("stop recording error", "Stop Recording Error:", e)              
    }                                                                          
    try {                                                                      
        player.prepare()                                                        
    } catch (e: IOException) {                                                  
        Log.d("recording error", "recording error:", e)                        
    }                                                                          
}                                                                              

private fun play() {                                                            
    player.start()                                                              
    button_record.isEnabled = false                                            
}                                                                              

override fun onCompletion(mp: MediaPlayer?) {                                  
    handler = Handler()                                                        
    handler?.postDelayed({button_record.isEnabled = true}, 1000)                
}

Я не могу понять, почему, но у меня есть кнопка записи, которая записывает звук. Когда действие загружается впервые, запись загружается. Когда я нажимаю его во второй раз, потому что мне не нравится моя первая запись, вместо того, чтобы перезаписать старый файл и заново настроить запись, приложение вылетает.

1 Ответ

0 голосов
/ 02 мая 2018

В Руководстве разработчика по Android написано

Когда вы закончите с экземпляром MediaRecorder, освободите его ресурсы. как можно скорее, позвонив release ().

см. пример кода с сайта разработчика:

private void stopRecording() {
    recorder.stop();
    recorder.release();
    recorder = null;
}

Ваш фрагмент кода не проверяет, используется ли recorder. Возможно, вы захотите сделать это, прежде чем снова использовать объект MediaRecorder.

private fun record() {
    if (recording) {
        stopRecording()
    }

    // do recording snippet here...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...