通话logging – 使其在N​​exus 5X上工作(可以使用生根或自定义ROM)

我试图在AudioSource.VOICE_DOWNLINK上使用AudioRecord ,Nexus 5X,Android 7.1(我自己的AOSP版本)。

我已经过了权限阶段 – 将我的APK移至特权应用程序,对Android源代码中的AudioRecord进行了调整,以停止抛出关于此源的exception。

现在,我正在打电话时收到空的录音缓冲区。

我知道有很多电话录音应用程序,他们在其他设备上工作。 我也看到了某些应用程序,可以执行一些根植N5的黑客,并使其工作。

我希望在Nexus 5X上也能达到同样的效果 – 任何调整对我来说都是可以的,包括更改Android版本,修改Qualcomm驱动程序,设备configuration文件等等 – 基本上任何可以在自定义ROM中实现的function。

我已经尝试过使用平台代码 – 硬件/ qcom / audio / hal / voice.c,特别是voice_check_and_set_incall_rec_usecase函数,但是到目前为止没有任何意义。

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

 <!-- 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的特定问题,但通常用于logging调用的类是MediaRecorder 。 你试过用AudioRecorderreplaceMediaRecorder吗?

    基于这个堆栈溢出问题,我认为你可以尝试基于本博客的以下代码:

     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(); } } 

    在这个示例中,我使用了MediaRecorder.AudioSource.VOICE_CALL但是您可以testingMediaRecorder.AudioSource.VOICE_COMMUNICATION等其他选项以及麦克风,以查看手机是否存在任何硬件问题。