Android MediaRecorder не работает на некоторых устройствах - PullRequest
0 голосов
/ 29 августа 2018

Я запускаю Media Recorder в фоновом режиме, который отлично работает на устройствах Samsung 6.0 и выше, но не работает на более низких устройствах. Бросив ниже исключение

stop called in an invalid state: 4

 FATAL EXCEPTION: main
                                                                     Process: com.shoaibnwar.crighter, PID: 28547
                                                                     java.lang.IllegalStateException
                                                                         at android.media.MediaRecorder._stop(Native Method)
                                                                         at android.media.MediaRecorder.stop(MediaRecorder.java:946)
                                                                         at com.shoaibnwar.crighter.Services.RecordingAudio.stopRecording(RecordingAudio.java:114)
                                                                         at com.shoaibnwar.crighter.Services.RecordingAudio.access$000(RecordingAudio.java:24)
                                                                         at com.shoaibnwar.crighter.Services.RecordingAudio$1.run(RecordingAudio.java:69)
                                                                         at android.os.Handler.handleCallback(Handler.java:739)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                         at android.os.Looper.loop(Looper.java:145)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:7007)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at java.lang.reflect.Method.invoke(Method.java:372)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

Вот мой код начала записи

private void startRecording(File file) {

    if (mediaRecorder != null) {
        mediaRecorder.reset();
        mediaRecorder.release();
    }
    mediaRecorder = new MediaRecorder();
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    //mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);
   // mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
    //mediaRecorder.setOutputFile(file.getAbsolutePath());

    mediaRecorder.setOutputFile(file.getAbsolutePath());
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

   /* if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.HE_AAC);
        mediaRecorder.setAudioEncodingBitRate(48000);
    } else {
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mediaRecorder.setAudioEncodingBitRate(64000);
    }
    mediaRecorder.setAudioSamplingRate(16000);*/
    try {
        mediaRecorder.prepare();
        mediaRecorder.start();
    } catch (IOException e) {
        Log.e("giftlist", "io problems while preparing [" +
                file.getAbsolutePath() + "]: " + e.getMessage());
    }
}

и функция остановки записи

private void stopRecording() {
    if (mediaRecorder != null) {
        mediaRecorder.stop();
        mediaRecorder.release();
        mediaRecorder = null;
    }
}

Я задаю путь к файлу, как показано ниже

private File getOutputFile() {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.US);

    return new File(Environment.getExternalStorageDirectory().getAbsolutePath().toString()
            +File.separator
            +Environment.DIRECTORY_MUSIC
            +File.separator
            + "/CRighterVoice/RECORDING_"
            + dateFormat.format(new Date())
            + ".m4a");


}

1 Ответ

0 голосов
/ 18 сентября 2018

У меня такое же лицо, что я получил от поиска в том, что основная проблема в
mediaRecorder.setAudioSource, потому что вы здесь используете AudioSource.MIC, поэтому некоторые устройства не поддерживают это. Есть несколько источников аудиозаписи, которые мы можем использовать при подготовке записи doc , но, к сожалению, в каждом устройстве это может отличаться , Для некоторых VOICE_CALL работает, а для некоторых других. Но, по крайней мере, мы можем попробовать. так что в моем случае устройство, которое ниже 6 VOICE_CALL работает нормально.

Другими причинами является то, что «Иногда подготовка занимает некоторое время для завершения», я нашел этот пример проекта здесь , который по какой-то причине спит в течение 2 секунд в потоке пользовательского интерфейса между вызовами подготовки и запуска MediaRecorder. Работает нормально.

Ниже приведена ссылка проекта Ссылка , что вы успешно записываете вызов и проверяете, как меняется источник мультимедиа на всех устройствах. Надеюсь, что это решит вашу проблему.

...