Java 通话记录应用程序在7.0版以上的android系统中不工作
我正在开发通话记录应用程序,它在android操作系统版本6.0之前运行良好,但在操作系统版本7.0或更高版本上停止记录来电语音。根据设备要求,我正在使用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
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)请求了该权限;并在清单中声明了权限。我的应用程序在运行时请求相同的权限