25

我試圖在Nexus 5X,Android 7.1(我自己的AOSP版本)上使用AudioRecordAudioSource.VOICE_DOWNLINK通話記錄 - 使其在N​​exus 5X上工作(生根或自定義ROM可能)

我已經過了權限階段 - 將我的APK移至特權應用,並對Android源代碼中的AudioRecord進行了調整,以停止引發此源的異常。

現在我在通話期間收到空的錄音緩衝區。

我知道有很多通話錄音應用程序,他們在其他設備上工作。 我也看到了某些應用程序可以在根N5上執行一些破解並使其正常工作。

我希望在Nexus 5X上實現同樣的效果 - 任何調整對我來說都是可以的,包括更改Android版本,修改Qualcomm驅動程序,設備配置文件等等 - 基本上可以在自定義ROM中實現的任何操作。

我已經嘗試了平臺代碼 - 硬件/ qcom/audio/hal/voice.c,特別是函數voice_check_and_set_incall_rec_usecase,但是到目前爲止它還是沒有意義。

還檢查設備/ LGE /大頭/ mixer_paths.xml,發現有來電記錄相關的一個部分:

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

但我也不能弄明白它或它如何能夠得到幫助。

+0

你有什麼期待嗎? –

+0

嘗試將audioRecoder.record()放在try catch中並檢查。 也發佈您的錄音代碼。 –

+0

沒有碰撞,所以在試穿時沒有意義。 – SirKnigget

回答

0

不確定它是否是Nexus 5特定問題,但通常用於記錄調用的類是MediaRecorder。你有沒有試過用MediaRecorder代替AudioRecorder

基於this堆棧溢出的問題,我想你可以嘗試基於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(); 
    } 

} 

在此示例中,我使用MediaRecorder.AudioSource.VOICE_CALL但你可以測試像MediaRecorder.AudioSource.VOICE_COMMUNICATION,也是其他選項麥克風只是爲了看看你的手機是否有硬件問題。

+0

我需要使用AudioRecord進行實時錄製。 – SirKnigget

+0

**現在,我正在打電話時獲得空的錄音緩衝區** - 是否因爲AudioRecorder和呼叫使用相同的頻道?你有沒有嘗試收聽一些不同的信息來源,比如打電話給揚聲器,然後嘗試 – Debu

+0

我不想把電話打到揚聲器上,我需要從AudioSource.VOICE_CALL正確記錄這個呼叫。 – SirKnigget