可以使用android 10(2019)录制语音通话吗?

时间:2019-09-06 12:29:17

标签: android accessibility android-10.0 call-recording

我真的对Android中的通话记录感兴趣。但是,您已经知道android正式关闭了android 9中的语音通话记录。但是就在Android 10发行(2019年9月3日)之后,在浏览其新发行说明时,我遇到了以下页面,该页面看起来很有希望通话录音。 https://developer.android.com/guide/topics/media/sharing-audio-input。 在这里,有关语音通话录音的内容如下。

语音通话+普通应用
如果AudioManager.getMode()返回的音频模式是MODE_IN_CALL或MODE_IN_COMMUNICATION,则语音通话处于活动状态。

Android根据以下规则共享输入音频:

该呼叫始终接收音频。 如果该应用是无障碍服务,则可以捕获音频。 如果该应用是具有权限CAPTURE_AUDIO_OUTPUT的特权(预安装)应用,则该应用可以捕获语音呼叫。

要捕获语音呼叫的上行链路(TX),下行链路(RX)或两者,应用必须指定音频源MediaRecorder.AudioSource.VOICE_UPLINK或MediaRecorder.AudioSource.VOICE_DOWNLINK和/或设备AudioDeviceInfo.TYPE_TELEPHONY。

因此,阅读本文后,我尝试在辅助功能服务中捕获音频。这是我的代码。 无障碍服务

    public class MyAccessibilityService extends AccessibilityService {
FrameLayout mLayout;
public MyAccessibilityService() {
}

@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {

}

@Override
public void onInterrupt() {

}

@Override
protected void onServiceConnected() {

    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    mLayout = new FrameLayout(this);
    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    lp.type = WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
    lp.format = PixelFormat.TRANSLUCENT;
    lp.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
    lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
    lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
    lp.gravity = Gravity.TOP;
    LayoutInflater inflater = LayoutInflater.from(this);
    inflater.inflate(R.layout.action_bar, mLayout);
    wm.addView(mLayout, lp);


    configureStartRecording();
    configureStopRecording();
}

private void configureStartRecording() {
    Button startRecordingButton = mLayout.findViewById(R.id.btnStartRecording);
    startRecordingButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            CustomMediaRecorder recorder = CustomMediaRecorder.getInstance();
            File audiofile = null;
            String out = new SimpleDateFormat("dd-MM-yyyy hh-mm-ss").format(new Date());
            File sampleDir = new File(getExternalFilesDir(null), "/TestRecordingDasa1");
            if (!sampleDir.exists()) {
                sampleDir.mkdirs();
            }
            String file_name = "Record";
            try {
                audiofile = File.createTempFile(file_name, ".amr", sampleDir);
            } catch (IOException e) {
                e.printStackTrace();
            }

            recorder.getRecorder().setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);
            recorder.getRecorder().setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
            recorder.getRecorder().setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            recorder.getRecorder().setOutputFile(audiofile.getAbsolutePath());
            try {
                recorder.getRecorder().prepare();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            recorder.start(getApplicationContext());

            Log.i(MainActivity.LOG_PREFIX, String.format("Recording started. Saving to path: '%s'", audiofile.getAbsolutePath()));

        }
    });
}

private void configureStopRecording() {
    Button button = mLayout.findViewById(R.id.btnStopRecording);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            CustomMediaRecorder recorder = CustomMediaRecorder.getInstance();
            recorder.stop();
        }
    });
}

并且可访问性服务配置具有以下配置

    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagDefault"
    android:canPerformGestures="true"
    android:canRetrieveWindowContent="true"

所以这是我的观察。
1.仍然无法设置MediaRecorder.AudioSource.VOICE_DOWNLINK和VOICE_UPLINK音频源。会引发异常。
2.在开始呼叫之前和断开呼叫之后,当为MediaRecorder.AudioSource.VOICE_COMMUNICATION和MediaRecorder.AudioSource.MIC分配了麦克风输入时。

这样看来,即使从辅助功能服务中,我们也无法从呼叫中获得任何流。我在新近更新到android 10的像素3A xl设备上尝试了此操作。

因此,在阅读本文之后,以及在我的审判失败后,我有以下问题...

  1. 这种针对Android 10的新行为的真正含义是什么。这里与无障碍服务有什么关系?我尝试过但已经失败了?
  2. 在配置辅助功能期间我做错了什么吗?
  3. 如果这种方法不能解决通话记录问题,那么android 10是否也缺少通话记录功能?还是在android 10中有其他方法可以使用它,因为我只对android 10中的通话记录感兴趣。

简而言之,我只想知道是否使用android 10来恢复语音通话录音...

1 个答案:

答案 0 :(得分:2)

首先感谢您的代码。我尝试使用相同的代码,并且使用了MediaRecorder.AudioSource.VOICE_RECOGNITION,并且在三星S10,Oneplus 7和Real Me中都获得了通话记录。