Android 通话录音-使其在Nexus 5X上工作(可以使用根目录或自定义ROM)

Android 通话录音-使其在Nexus 5X上工作(可以使用根目录或自定义ROM),android,alsa,android-mediarecorder,android-audiorecord,android-rom,Android,Alsa,Android Mediarecorder,Android Audiorecord,Android Rom,我正在尝试在Nexus 5X、Android 7.1(我自己的AOSP版本)上使用AudioRecord和AudioSource.VOICE\u下行链路 我已经过了权限阶段-将我的APK移动到特权应用程序,在Android source中调整了音频录制,以停止抛出有关此源的异常 现在我在打电话时得到了空的录音缓冲区 我知道有很多电话录音应用程序,它们可以在其他设备上使用。 我也看到过一些应用程序可以对一个有根的N5进行一些黑客攻击并使其正常工作 我希望在Nexus 5X上实现同样的功能-任何调整

我正在尝试在Nexus 5X、Android 7.1(我自己的AOSP版本)上使用
AudioRecord
AudioSource.VOICE\u下行链路

我已经过了权限阶段-将我的APK移动到特权应用程序,在Android source中调整了
音频录制
,以停止抛出有关此源的异常

现在我在打电话时得到了空的录音缓冲区

我知道有很多电话录音应用程序,它们可以在其他设备上使用。 我也看到过一些应用程序可以对一个有根的N5进行一些黑客攻击并使其正常工作

我希望在Nexus 5X上实现同样的功能-任何调整对我来说都可以,包括更改Android版本、修改高通公司的驱动程序、设备配置文件等-基本上可以在定制ROM中实现任何功能

我尝试过混用平台代码——hardware/qcom/audio/hal/voice.c,特别是函数
voice\u check\u和\u set\u incall\u rec\u usecase
,但到目前为止还没有意义

还检查了device/lge/bullhead/mixer_paths.xml,发现有一个与通话记录相关的部分:

<!-- Incall Recording -->
<ctl name="MultiMedia1 Mixer VOC_REC_UL" value="0" />
<ctl name="MultiMedia1 Mixer VOC_REC_DL" value="0" />
<ctl name="MultiMedia8 Mixer VOC_REC_UL" value="0" />
<ctl name="MultiMedia8 Mixer VOC_REC_DL" value="0" />
<!-- Incall Recording End -->


但是我也无法理解它或者如何帮助它。

不确定它是否是Nexus 5的特定问题,但通常用于记录呼叫的类是
MediaRecorder
。您是否尝试过用
MediaRecorder
替换
AudioRecorder

基于堆栈溢出问题,我认为您可以尝试以下基于的代码:


在本示例中,我使用了
MediaRecorder.AudioSource.VOICE_CALL
,但您可以测试其他选项,如
MediaRecorder.AudioSource.VOICE_COMMUNICATION
,以及麦克风,以查看您的手机是否存在任何硬件问题

我需要用录音机来实时录音。现在我在电话通话中得到了空的录音缓冲区-是因为录音机和通话都使用同一频道吗????你有没有试过听一些不同的声音来源,比如把电话放在扬声器上,然后试着把电话放在扬声器上。我对把电话放在扬声器上不感兴趣,我需要从音频来源正确地录下电话。所以也许你可以分享你的代码,这样就更容易看到发生了什么。AudioRecorder不像MediaRecorder那么常见,但这里有一个很好的示例-注意,您需要在一个单独的线程中运行它:您有什么期望吗?请尝试将AudioRecorder.record()放在一个try catch and check中。也可以发布一些录音代码。没有崩溃,所以try-catch没有意义。SLIMbus℠ 使用“串行低功耗芯片间媒体总线”。访问该音频流的唯一方法是更改ALSA混音器分配音频路径的方式。较新版本的Android现在有
来电选项
记录通话(4)
(按住键
4
?);但是,SDK不提供对这些内容的访问。。。解释它(默认情况下,只能通过默认音频设备播放)。嗨,Martin,我不需要SDK-修改AOSP对我来说没问题。你知道怎么做你说的Nexus 5X吗?
import android.media.MediaRecorder;
import android.os.Environment;

import java.io.File;

import java.io.IOException;


public class CallRecorder {

    final MediaRecorder recorder = new MediaRecorder();
    final String path;

    /**
     * Creates a new audio recording at the given path (relative to root of SD card).
     */
    public CallRecorder(String path) {
        this.path = sanitizePath(path);
    }

    private String sanitizePath(String path) {
        if (!path.startsWith("/")) {
            path = "/" + path;
        }
        if (!path.contains(".")) {
            path += ".3gp";
        }
        return Environment.getExternalStorageDirectory().getAbsolutePath() + path;
    }

    /**
     * Starts a new recording.
     */
    public void start() throws IOException {
        String state = android.os.Environment.getExternalStorageState();
        if(!state.equals(android.os.Environment.MEDIA_MOUNTED))  {
            throw new IOException("SD Card is not mounted.  It is " + state + ".");
        }

        // make sure the directory we plan to store the recording in exists
        File directory = new File(path).getParentFile();
        if (!directory.exists() && !directory.mkdirs()) {
            throw new IOException("Path to file could not be created.");
        }

        recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setOutputFile(path);
        recorder.prepare();
        recorder.start();
    }

    /**
     * Stops a recording that has been previously started.
     */
    public void stop() throws IOException {
        recorder.stop();
        recorder.release();
    }

}