35 votes

Enregistrement d'appel - faites-le fonctionner sur Nexus 5X (enracinement ou ROM personnalisée possible)

Je suis d'essayer d'utiliser AudioRecord avec AudioSource.VOICE_DOWNLINK sur le Nexus 5X, Android 7.1 (mon propre build de PSBA).

Je suis déjà passé les autorisations stade déplacé mon APK privilégiée des applications, faites un ajustement AudioRecord dans Android source d'arrêter de jeter une exception à propos de cette source.

Maintenant, je suis vide d'enregistrement des tampons pendant un appel téléphonique.

Je sais qu'il y a beaucoup d'applications d'enregistrement d'appels, et ils travaillent sur d'autres appareils. J'ai aussi vu certaines applications qui peuvent effectuer certains hack sur un enracinée N5 et de la faire fonctionner.

Je souhaite obtenir la même sur le Nexus 5X - TOUT ajustement est OK pour moi, notamment le changement de version d'Android, la modification de Qualcomm pilotes de périphérique fichiers de configuration, etc. - plus généralement tout ce qui peut être réalisé dans une ROM personnalisée.

J'ai essayé de déconner avec plate-forme de code - matériel/qcom/audio/hal/voix.c, en particulier la fonction voice_check_and_set_incall_rec_usecase, mais ne pouvait pas faire sens jusqu'à présent.

Aussi vérifié device/lge/bullhead/mixer_paths.xml, trouvé il y a une section relative à l'enregistrement des appels:

<!-- 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 -->

Mais je ne pouvais pas faire de sens en dehors d'elle ou comment il peut être aidé.

1voto

Marcio Jasinski Points 979

Pas sûr si c'est un Nexus 5 spécifique de la question, mais généralement la classe utilisée pour enregistrer les appels est - MediaRecorder. Avez-vous essayé de remplacer AudioRecorder par MediaRecorder?

Basé sur cette pile de dépassement de la question, je pense que tu pourrais essayer le code suivant basé sur Ben post de blog:

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

}

Dans cet exemple, j'ai utilisé MediaRecorder.AudioSource.VOICE_CALL mais vous pouvez essayer d'autres options comme l' MediaRecorder.AudioSource.VOICE_COMMUNICATION et aussi le micro juste pour voir si il y a les problèmes liés au matériel sur votre téléphone.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X