Как установить максимальную продолжительность записи, выпустить файл и начать запись автоматически с помощью медиа-рекордера - PullRequest
0 голосов
/ 18 июня 2019

В моем приложении есть функция, которая записывает звук с помощью Media Recorder, который запускается через службу (IntentService), так что он записывается в фоновом режиме.

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

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

Я попытался использовать setOnInfoListener, но это событие никогда не вызывается, когда я определяю maxDuration в одну минуту, по истечении этого времени logcat показывает это сообщение и останавливает аудиозапись:

Обработчик (android.media.MediaRecorder $ EventHandler) {ee2b629}, отправляющий сообщение обработчику в мертвой ветке java.lang.IllegalStateException: обработчик (android.media.MediaRecorder $ EventHandler) {ee2b629} отправка сообщения обработчику в мертвом потоке на android.os.MessageQueue.enqueueMessage (MessageQueue.java:545) на android.os.Handler.enqueueMessage (Handler.java:661) на android.os.Handler.sendMessageAtTime (Handler.java:630) на android.os.Handler.sendMessageDelayed (Handler.java:600) на android.os.Handler.sendMessage (Handler.java:537) на android.media.MediaRecorder.postEventFromNative (MediaRecorder.java:1709)

        mediaRecorder = new MediaRecorder();
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mediaRecorder.setOutputFile(file.getPath());
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mediaRecorder.setMaxDuration(60000); 
        mediaRecorder.prepare();
        mediaRecorder.start();

        mediaRecorder.setOnInfoListener((mr, what, extra) -> {
            if(what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED){
               //Do somethings
            }
        });
...