Registrazione delle chiamate – triggers il Nexus 5X (ansible il rooting o la ROM personalizzata)

Sto tentando di utilizzare AudioRecord con AudioSource.VOICE_DOWNLINK su Nexus 5X, Android 7.1 (la mia build da AOSP).

Ho già superato la fase delle autorizzazioni, ho spostato il mio APK in app privilegiate, ho apportato un adeguamento a AudioRecord nella sorgente Android per interrompere l’ AudioRecord di un’eccezione su questa fonte.

Ora ricevo buffer di registrazione vuoti durante una telefonata.

So che ci sono molte app di registrazione delle chiamate e funzionano su altri dispositivi. Ho anche visto alcune app che possono eseguire alcuni hack su un N5 root e farlo funzionare.

Desidero ottenere lo stesso risultato su Nexus 5X: QUALSIASI rettifica è accettabile per me, inclusa la modifica della versione di Android, la modifica dei driver di Qualcomm, i file di configurazione del dispositivo, ecc., In pratica tutto ciò che è ansible ottenere in una ROM personalizzata.

Ho provato a trafficare con il codice della piattaforma – hardware / qcom / audio / hal / voice.c, in particolare la funzione voice_check_and_set_incall_rec_usecase , ma non ho potuto voice_check_and_set_incall_rec_usecase senso fino ad ora.

Controllato anche device / lge / bullhead / mixer_paths.xml, trovato che c’è una sezione relativa alla registrazione delle chiamate:

       

Ma anche io non ho potuto dare un senso a questo o a come può essere aiutato.

    Non sono sicuro se si tratta di un problema specifico di Nexus 5, ma in genere la class utilizzata per registrare le chiamate è MediaRecorder . Hai provato a sostituire AudioRecorder con un MediaRecorder ?

    In base a questa domanda di overflow dello stack, penso che potresti provare il seguente codice basato sul post del blog Ben :

     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 questo esempio ho usato MediaRecorder.AudioSource.VOICE_CALL ma puoi testare altre opzioni come MediaRecorder.AudioSource.VOICE_COMMUNICATION e anche il microfono solo per vedere se ci sono problemi hardware sul tuo telefono.