Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call recording - make it work on Nexus 5X (rooting or custom ROM possible)

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.

like image 940
SirKnigget Avatar asked May 06 '17 09:05

SirKnigget


People also ask

Which software is best for call recording?

Aircall — Best call center solution. Talkdesk — Best for voice and screen recording. Cube ACR — Best call recorder for android. Callcap — Best for call monitoring.

How do you record call in Android without knowing them?

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.


1 Answers

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.

like image 59
Marcio Jasinski Avatar answered Oct 21 '22 06:10

Marcio Jasinski