小米设备在通话录音时出现MediaRecorder.start()失败的问题。

3

在录制电话时,recorder.start() 出现问题并生成异常,一些设备会产生启动失败的异常,一些设备只记录单侧语音,而有些设备可以正常工作。实际上,在小米设备上无法正常工作。以下是我的代码。

                recorder = new MediaRecorder();
                recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
                recorder.setAudioSamplingRate(8000);
                recorder.setAudioEncodingBitRate(12200);
                recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                recorder.setOutputFile(audioFile.getAbsolutePath());
                try {
                    recorder.prepare();
                } catch (IllegalStateException | IOException e) {
                    e.printStackTrace();
                }
                recorder.start();

提前致谢


在一些设备上,是哪些设备?可能是Android版本的问题,从Android 6.0开始,您必须允许权限,这可能是问题所在。 - Abdul Kawee
不,问题不在于Android版本。将音频源更改为MIC在所有设备上都可以工作,但VOICE_CALL无法工作。 - Aditi
找到任何解决方案了吗? - Moorthy
@Aditi,感谢您的回复。如果找到任何解决方案,请在此更新。我也在寻找解决方法。 - Moorthy
@Aditi,你找到了解决方案吗? - Maniraj
显示剩余4条评论
1个回答

0

我认为你忘记检查权限了。在启动MediaRecorder之前,请调用checkPermission()。

public void checkPermission() {
    // Check for permissions
    int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    int permissionRecord = ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO);
    // If we don't have permissions, ask user for permissions
    if (permission != PackageManager.PERMISSION_GRANTED || permissionRecord != PackageManager.PERMISSION_GRANTED) {
        String[] PERMISSIONS_STORAGE = {
                android.Manifest.permission.READ_EXTERNAL_STORAGE,
                android.Manifest.permission.RECORD_AUDIO,
                android.Manifest.permission.WRITE_EXTERNAL_STORAGE
        };

        ActivityCompat.requestPermissions(
                AudioRecorderActivity.this,
                PERMISSIONS_STORAGE,
                PERMISSION_REQUEST_RECORD
        );
    }
}


@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_RECORD: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 1
                    && grantResults[1] == PackageManager.PERMISSION_GRANTED && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            } else {
                Toast.makeText(this, "Recording permission not found", Toast.LENGTH_LONG).show();
                finish();
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接