android - android 10 (2019) 可以恢复语音通话录音吗?

标签 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 .
这里可以看到关于语音通话录音的以下内容。

语音通话+普通APP

如果 AudioManager.getMode() 返回的音频模式是 MODE_IN_CALL 或 MODE_IN_COMMUNICATION,则语音调用处于 Activity 状态。

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 设备上尝试了这个。

所以在阅读了这篇文章之后,在我失败的试验之后,我有以下问题......
  • android 10 的这种新行为真正意味着什么。无障碍服务在这里有什么意义?我尝试过但已经失败了?
  • 在配置无障碍服务时我做错了什么吗?
  • 如果这种方法不能解决通话录音问题,Android 10 是否也缺少通话录音功能?或者在android 10中还有其他方法吗。因为我只对android 10中的通话录音感兴趣。

  • 简而言之,我只想知道 android 10 是否恢复了语音通话记录...

    最佳答案

    首先感谢您的代码。我尝试使用相同的代码并使用了 MediaRecorder.AudioSource.VOICE_RECOGNITION我在三星 S10、一加 7 和 Real Me 中都进行了通话录音。

    关于android - android 10 (2019) 可以恢复语音通话录音吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57822073/

    相关文章:

    java - 根据按下的按钮显示信息

    android - Android 10 上带有远程 View 的深色通知

    android - 当 Android Q 中的 minifyEnabled = true 时,具有数据绑定(bind)的 LiveData 不起作用

    java - Android - 将视频保存到内部存储

    安卓工作室 : “new module -> import existing project” vs. “import module”

    javascript - 当焦点离开 div 中的所有子链接时,触发事件

    html - 如何使屏幕截图图像易于访问?

    android - 如何在 Android Q 上将照片广播到图库

    java - 尝试膨胀布局时适配器出现异常

    accessibility - 我如何确保我的网站可供残疾人访问?