I'm attempting to use AudioRecord
with AudioSource.VOICE_DOWNLINK
on Nexus 5X, Android 7.1 (my own build from AOSP).
I'm already past the permissions stage - moved my APK to privileged apps, made an adjustment to AudioRecord
in Android source to stop throwing an exception about this source.
Now I'm getting empty recording buffers during a phone call.
I know that there are a lot of call recording apps, and they work on other devices. I've also seen certain apps that can perform some hack on a rooted N5 and make it work.
I wish to achieve the same on Nexus 5X - ANY adjustment is OK for me, including changing Android version, modifying Qualcomm drivers, device configuration files, etc. - basically anything that can be achieved in a custom ROM.
I've tried messing around with platform code - hardware/qcom/audio/hal/voice.c, especially the function voice_check_and_set_incall_rec_usecase
, but could not make sense out of it so far.
Also checked device/lge/bullhead/mixer_paths.xml, found there's a section related to call recording:
<!-- 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 -->
But I also couldn't make sense out of it or how it can be helped.
Aircall — Best call center solution. Talkdesk — Best for voice and screen recording. Cube ACR — Best call recorder for android. Callcap — Best for call monitoring.
If you have an Android phone, the Automatic Call Recorder by Appliqato is one of the best apps available in the Google Play Store for recording phone calls. Once installed, the app automatically records all outgoing and incoming phone calls without alerting the person you're recording.
Not sure if it is a Nexus 5 specific issue but usually the class used to record calls is MediaRecorder
. Have you tried to replace AudioRecorder
by a MediaRecorder
?
Based on this stack-overflow question, I think you could try the following code based on Ben blog post:
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(); } }
In this sample, I've used MediaRecorder.AudioSource.VOICE_CALL
but you can test other options like MediaRecorder.AudioSource.VOICE_COMMUNICATION
and also the microphone just to see if there are any hardware issues on your phone.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With