25

Ich versuche AudioRecord mit AudioSource.VOICE_DOWNLINK auf Nexus 5X, Android 7.1 (meine eigene Version von AOSP) zu verwenden.Anrufaufzeichnung - Funktioniert auf Nexus 5X (Rooten oder benutzerdefiniertes ROM möglich)

Ich bin bereits hinter der Genehmigungsstufe - hat meine APK in privilegierte Apps verschoben, eine Anpassung an AudioRecord in Android-Quelle vorgenommen, um das Auslösen einer Ausnahme für diese Quelle zu stoppen.

Jetzt bekomme ich leere Aufnahmepuffer während eines Telefonanrufs.

Ich weiß, dass es viele Anrufaufzeichnung Apps gibt, und sie funktionieren auf anderen Geräten. Ich habe auch bestimmte Apps gesehen, die einige Hacks auf einem gerooteten N5 ausführen können und es zum Laufen bringen.

Ich möchte das Gleiche auf Nexus 5X erreichen - JEDE Anpassung ist in Ordnung für mich, einschließlich Ändern der Android-Version, Ändern von Qualcomm-Treibern, Gerätekonfigurationsdateien usw. - im Grunde alles, was in einem benutzerdefinierten ROM erreicht werden kann.

Ich habe versucht, mit Platform-Code - Hardware/qcom/audio/hal/voice.c, vor allem die Funktion voice_check_and_set_incall_rec_usecase zu verwirren, konnte aber bisher keinen Sinn daraus machen.

geprüft Auch Gerät/LGE/Groppe/mixer_paths.xml fand ein Abschnitt gibt es im Zusammenhang Aufnahme zu nennen:

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

Aber ich kann Sinn nicht auch daraus zu machen oder, wie es geholfen werden kann.

+0

Erhalten Sie irgendwelche Erwartungen? –

+0

versuchen Sie audioRecoder.record() in einem Versuch fangen und überprüfen. Veröffentlichen Sie auch Ihren Aufnahmecode ein wenig. –

+0

Es gibt keinen Absturz, also hat es keinen Sinn, es zu versuchen. – SirKnigget

Antwort

0

Nicht sicher, ob es sich um ein Nexus 5-spezifisches Problem handelt, aber normalerweise ist die zum Aufzeichnen von Anrufen verwendete Klasse MediaRecorder. Haben Sie versucht, AudioRecorder durch eine MediaRecorder ersetzen?

Basierend auf this Stack-Überlauf Frage, ich glaube, Sie den folgenden Code auf Ben blog post basierend versuchen könnten:

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 diesem Beispiel habe ich verwendet MediaRecorder.AudioSource.VOICE_CALL aber Sie können andere Optionen wie MediaRecorder.AudioSource.VOICE_COMMUNICATION testen und auch die Mikrofon, um festzustellen, ob auf Ihrem Telefon Hardwareprobleme vorliegen.

+0

Ich brauche AudioRecord, um in Echtzeit aufzunehmen. – SirKnigget

+0

** Jetzt bekomme ich leere Aufzeichnungspuffer während eines Telefonats ** - liegt es daran, dass sowohl AudioRecorder als auch Anruf den gleichen Kanal benutzen ???? Haben Sie versucht, verschiedene Quellen zu hören, wie zum Beispiel den Anruf auf Lautsprecher und dann versuchen – Debu

+0

Ich bin nicht daran interessiert, den Anruf auf Lautsprecher setzen, muss ich den Anruf ordnungsgemäß von AudioSource.VOICE_CALL aufzeichnen. – SirKnigget

Verwandte Themen