Android中实现录制内置声音

时间:2025-03-08 22:40:44

Android中实现对内置声源的录制有两种方案

一、将应用打包为系统应用

AudioSource输入源

public final class AudioSource {

​​​​​​​private AudioSource() {}

/** Default audio source **/

public static final int DEFAULT = 0;

/** Microphone audio source */

public static final int MIC = 1;

/** Voice call uplink (Tx) audio source */

public static final int VOICE_UPLINK = 2;

/** Voice call downlink (Rx) audio source */

public static final int VOICE_DOWNLINK = 3;

/** Voice call uplink + downlink audio source */

public static final int VOICE_CALL = 4;

/** Microphone audio source with same orientation as camera if available, the main

* device microphone otherwise */

public static final int CAMCORDER = 5;

public static final int VOICE_RECOGNITION = 6;

public static final int VOICE_COMMUNICATION = 7;

public static final int REMOTE_SUBMIX = 8;

}

  • DEFAULT:默认为MIC,.RECORD_AUDIO
  •  MIC:麦克风,.RECORD_AUDIO 
  • VOICE_UPLINK:电话录音上行线路,.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用 
  • VOICE_DOWNLINK:电话录音下行线路,.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用
  •  VOICE_CALL:电话录音上下线路,.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用 
  • CAMCORDER:摄像头的麦克风,.RECORD_AUDIO 
  • VOICE_RECOGNITION:语音识别,.RECORD_AUDIO 
  • VOICE_COMMUNICATION:网络电话,.RECORD_AUDIO 
  • REMOTE_SUBMIX:传输到远程的音频混合流,默认情况下如果用该项录音,本地扬声器或者耳机的声音将会被截走,.CAPTURE_AUDIO_OUTPUT,系统权限不允许第三方app使用

REMOTE_SUBMIX可以实现内录功能,有两点比较麻烦:

(1)需要系统权限 

(2)会截走扬声器和耳机的声音,也就是说再录音时本地无法播放声音

  • 对于系统权限,需要在在添加 android:sharedUserId="",然后使用系统签名来打包应用,这样就第三方应用打包为系统应用,就可以使用系统权限了。 

对于系统签名,如果系统使用的是原生的系统,就可以直接在AOSP发布的Android源码获取签名证书

/aosp-mirror/platform_build/tree/master/target/product/security

用对应用进行签名  

java -jar platform. platform.pk8

signapk获取地址:

/techexpertize/SignApk

/maks/aosp-signapk

  • 对于截走扬声器和耳机的声音问题 

修改frameworks下av/services/audiopolicy/

if ((AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0")) != 0) {

device2 = availableOutputDeviceTypes & AUDIO_DEVICE_OUT_REMOTE_SUBMIX;

}

修改为:

if ((AUDIO_DEVICE_OUT_REMOTE_SUBMIX, String8("0")) != 0) {

device2 = availableOutputDeviceTypes & AUDIO_DEVICE_OUT_REMOTE_SUBMIX;

device2 |= (availableOutputDeviceTypes & AUDIO_DEVICE_OUT_WIRED_HEADPHONE);

​​​​​​​device2 |= (availableOutputDeviceTypes & AUDIO_DEVICE_OUT_SPEAKER);

}

现在就可以使用.REMOTE_SUBMIX实现内录功能了。

该方案只适用于知道系统签名或者自己编译系统源码的情况

参考文章:

/p/916ede1d1f48 /liuhaitao_share/article/details/41249175 /jinzhuojun/article/details/33748031

二、使用Root权限修改底层驱动

第二种方法来自开源项目:

/iwo/SCR-Screen-Recorder-app