【问题标题】:Android MediaRecorder not working in some devicesAndroid MediaRecorder 在某些设备上不起作用
【发布时间】:2018-08-29 18:59:00
【问题描述】:

我正在后台服务中运行媒体记录器,该服务在三星 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");


}

【问题讨论】:

  • 在这些“较低”的设备上,mediaRecorder.start() 是否成功执行,没有抛出?
  • yes mediaRecorder.start 像 5.0 设备一样运行成功,但是调用停止函数时抛出异常
  • 嗯...可能是 SD 卡上的权限,如this question's cmets 中所述。尝试 A.) 使用常规 getFilesDir() 中的文件进行测试或 B.) 确保您拥有 WRITE_EXTERNAL_STORAGE 权限。
  • 这是棒棒糖设备的问题,在 6 或更高版本中可以找到。
  • 仍可能是文件访问问题。也许你的路径是错误的。考虑一下:您错误地使用了Environment.DIRECTORY_MUSIC;这只是“音乐”这个词。要正确构建到该位置的路径,您应该使用Environment.getExternalStoragePublicDirectory()。也许你形成的路径只是发生在更高的 API 级别上是正确的。

标签: android audio-recording mediarecorder


【解决方案1】:

尝试调用

mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

之前

mediaRecorder.setOutputFile(file.getAbsolutePath());

【讨论】:

    【解决方案2】:

    我也有同样的问题。我从搜索中得到的是基本问题在
    mediaRecorder.setAudioSource(),因为您使用的是AudioSource.MIC,所以某些设备不支持此功能。

    在准备录音doc here 时,我们可以使用一些录音源,但遗憾的是,在每个不同的设备中,它可能会有所不同。

    对于某些设备,VOICE_CALL 有效,而对于某些设备,还有其他设备。但至少我们可以尝试。所以在我的例子中,运行低于 6 的 Android 的设备,VOICE_CALL 工作正常。

    另一个原因是有时准备需要一些时间才能完成。我发现了这个示例项目here,由于某种原因,它在mediaRecorder 的准备和启动调用之间的UI 线程上休眠了2 秒。它工作正常。

    以下是project的链接,您可以看到成功记录通话并检查媒体源在所有设备中的变化情况。

    希望这能解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-27
      • 2014-09-20
      • 2015-03-11
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多