Java 通话记录应用程序在7.0版以上的android系统中不工作

Java 通话记录应用程序在7.0版以上的android系统中不工作,java,android,Java,Android,我正在开发通话记录应用程序,它在android操作系统版本6.0之前运行良好,但在操作系统版本7.0或更高版本上停止记录来电语音。根据设备要求,我正在使用MediaRecorder.AudioSource.VOICE_CALL和MediaRecorder.AudioSource.VOICE_COMMUNICATION。在下面提供代码 private boolean startMediaRecorder(int audioSource){ recorder = new MediaRecor

我正在开发通话记录应用程序,它在android操作系统版本6.0之前运行良好,但在操作系统版本7.0或更高版本上停止记录来电语音。根据设备要求,我正在使用
MediaRecorder.AudioSource.VOICE_CALL
MediaRecorder.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清单中启用了权限,但需要
捕获音频输出
权限才能在两端录制语音,这是系统级权限,因此我在授予此类权限时面临困难。请向我建议一种授予此类权限的方法,或在所有设备中启用
MediaRecorder.AudioSource.VOICE\u CALL
方法的任何替代方法

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

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


然后在启动程序活动的onCreate期间请求相同的请求。检查此项以获取详细解释。还要确保您使用的是
语音通话
,而不是现在不推荐使用的
语音通话

从Android M和更高版本开始,您需要在运行时请求许可。您可以将清单中的权限声明为

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


然后在启动程序活动的onCreate期间请求相同的请求。检查此项以获取详细解释。另外,请确保您使用的是
语音通信
,而不是现在不推荐使用的
语音通话

捕获音频输出
是一项特权。除非您的应用程序在有问题的设备上运行时作为专用应用程序运行,否则您无法请求它。这将帮助您获得更快的响应。logcat处于活动状态,我会为每个呼叫获取工作功能日志,但不会记录传入的语音。在下面发布日志,RecordService onStartCommand,RecordService STATE_INCOMING_NUMBER,RecordService startService,RecordService onStartCommand,RecordService STATE_CALL_START,RecordService startRecording,0x5578ed0000启动线程,CPU 6,RecordService onStartCommand,RecordService STATE_CALL_END,录音服务stopAndReleaseRecorder@apurvasave将日志文件输出添加到问题中,而不是添加注释。您可以编辑您的问题。
CAPTURE\u AUDIO\u OUTPUT
是一项特权。除非您的应用程序在有问题的设备上运行时作为专用应用程序运行,否则您无法请求它。这将帮助您获得更快的响应。logcat处于活动状态,我会为每个呼叫获取工作功能日志,但不会记录传入的语音。在下面发布日志,RecordService onStartCommand,RecordService STATE_INCOMING_NUMBER,RecordService startService,RecordService onStartCommand,RecordService STATE_CALL_START,RecordService startRecording,0x5578ed0000启动线程,CPU 6,RecordService onStartCommand,RecordService STATE_CALL_END,录音服务stopAndReleaseRecorder@apurvasave将日志文件输出添加到问题中,而不是添加注释。您可以编辑您的问题。我已经以int permersionRecordAudio=ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.RECORD\u AUDIO)的身份进行了编辑;并在清单中声明了权限。我的应用程序在运行时请求相同的权限我已经作为int permersionRecordAudio=ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.RECORD\u AUDIO)请求了该权限;并在清单中声明了权限。我的应用程序在运行时请求相同的权限