0

我正在开发通话录音应用程序,该应用程序在 android 操作系统版本 6.0 之前运行良好,但它停止在操作系统版本 7.0 及以上版本上录制来电语音。我正在使用MediaRecorder.AudioSource.VOICE_CALLMediaRecorder.AudioSource.VOICE_COMMUNICATION两者都根据设备要求。在下面提供代码,

private boolean startMediaRecorder(int audioSource){
    recorder = new MediaRecorder();
    try{
        recorder.reset();
        recorder.setAudioSource(audioSource);
        recorder.setAudioSamplingRate(8000);
        recorder.setAudioEncodingBitRate(12200);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        fileName = FileHelper.getFilename(phoneNumber,type,getApplicationContext());
        recorder.setOutputFile(fileName);

        OnErrorListener errorListener = new OnErrorListener() {
            public void onError(MediaRecorder arg0, int arg1, int arg2) {
                Log.e(Constants.TAG, "OnErrorListener " + arg1 + "," + arg2);
                terminateAndEraseFile();
            }
        };
        recorder.setOnErrorListener(errorListener);

        OnInfoListener infoListener = new OnInfoListener() {
            public void onInfo(MediaRecorder arg0, int arg1, int arg2) {
                Log.e(Constants.TAG, "OnInfoListener " + arg1 + "," + arg2);
                terminateAndEraseFile();
            }
        };
        recorder.setOnInfoListener(infoListener);

        recorder.prepare();
        // Sometimes prepare takes some time to complete
        Thread.sleep(2000);
        recorder.start();
        recording = true;
        return true;
    }catch (Exception e){
        e.getMessage();
        return false;
    }
}

private void startRecording(Intent intent) {
    Log.d(Constants.TAG, "RecordService startRecording");
    boolean exception = false;


    if (!startMediaRecorder(MediaRecorder.AudioSource.VOICE_CALL)){
        if(startMediaRecorder(MediaRecorder.AudioSource.MIC)){
            audioManager =(AudioManager) getSystemService(Context.AUDIO_SERVICE);
            audioManager.setMode(AudioManager.MODE_IN_CALL);
            audioManager.setStreamVolume(3,audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL),0);
            Intent intent1 = new Intent(getBaseContext(), DialogConfirmActivity.class);
            intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent1);
        }else{
            exception = true;
        }
    }

    if (exception) {
        terminateAndEraseFile();
    }

    if (recording) {
        Toast toast = Toast.makeText(this,
                this.getString(R.string.receiver_start_call),
                Toast.LENGTH_SHORT);
        toast.show();
    } else {
        Toast toast = Toast.makeText(this,
                this.getString(R.string.record_impossible),
                Toast.LENGTH_LONG);
        toast.show();
    }
}

我已经在 android manifests 中启用了权限,但它需要CAPTURE_AUDIO_OUTPUT在两端录制语音的权限,这是系统级权限,所以我在授予此类权限时遇到了困难。请建议我一种授予此类权限的方法或任何替代方法以MediaRecorder.AudioSource.VOICE_CALL在所有设备中启用该方法。

4

1 回答 1

2

在 Android M 及以上版本中,您需要在运行时请求许可。您可以在 Manifest 中声明权限为,

<uses-permission android:name="android.permission.RECORD_AUDIO" />

然后在启动器活动的 onCreate 期间要求相同的内容。检查此链接以获取详细说明。还要确保您使用VOICE_COMMUNICATION而不是VOICE_CALL现在已弃用。

于 2019-03-15T05:31:19.867 回答