Android 通话录音-使其在Nexus 5X上工作(可以使用根目录或自定义ROM)
我正在尝试在Nexus 5X、Android 7.1(我自己的AOSP版本)上使用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上实现同样的功能-任何调整
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();
}
}