RK3568/3588 Android 12 源码默认使用蓝牙mic录音

遇到客户一个需求,如果连接了带mic的蓝牙耳机,默认所有的录音要走蓝牙mic通道。

这个功能搞了好久,终于搞定了。

1. 向RK寻求帮助,先打通 bt sco能力。

此时,还无法默认就切换到蓝牙 mic通道,接下来我们需求默认切换到蓝牙通道。

2. 修改frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp,

默认走bt sco的mic录音输入源     

switch (inputSource) {
     case AUDIO_SOURCE_DEFAULT:
     case AUDIO_SOURCE_MIC:
         device = availableDevices.getDevice(
                 AUDIO_DEVICE_IN_BLUETOOTH_A2DP, String8(""), AUDIO_FORMAT_DEFAULT);
         if (device != nullptr) break;
         if (audio_is_bluetooth_out_sco_device(commDeviceType)) {
             device = availableDevices.getDevice(
                     AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, String8(""), AUDIO_FORMAT_DEFAULT);
             if (device != nullptr) break;
         }
         device = availableDevices.getFirstExistingDevice({
+                AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET,
                 AUDIO_DEVICE_IN_BLE_HEADSET, AUDIO_DEVICE_IN_WIRED_HEADSET,
                 AUDIO_DEVICE_IN_USB_HEADSET, AUDIO_DEVICE_IN_USB_DEVICE,
                 AUDIO_DEVICE_IN_BLUETOOTH_BLE, AUDIO_DEVICE_IN_BUILTIN_MIC});
         break;


    case AUDIO_SOURCE_CAMCORDER:
        // For a device without built-in mic, adding usb device
        device = availableDevices.getFirstExistingDevice({
-               AUDIO_DEVICE_IN_USB_DEVICE,
+              AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, AUDIO_DEVICE_IN_USB_DEVICE,
                AUDIO_DEVICE_IN_BACK_MIC, AUDIO_DEVICE_IN_BUILTIN_MIC});
        break;
    case AUDIO_SOURCE_VOICE_DOWNLINK:

3. 很关键的一步,在一个常驻service里边(或者可以在system ui模块实现)监听插入蓝牙耳机,进行默认sco模式切换

IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
registerReceiver(myReceiver, filter);
BroadcastReceiver myReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(intent.getAction())) {
            Log.d("mod@bt", "bt connected");
                    startBluetoothRecording(context);
            });
        } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(intent.getAction())) {
            Log.d("mod@bt", "bt disconnected");
                stopRecording(context);
            }
        }
    }
};

    public void startBluetoothRecording(Context context) {
        try {
            AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

            if (!audioManager.isBluetoothScoOn()) {
                audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
                audioManager.setBluetoothScoOn(true);
                audioManager.startBluetoothSco();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void stopRecording(Context context) {
        try {

            AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

            if (audioManager.isBluetoothScoOn()) {
                audioManager.setBluetoothScoOn(false);
                audioManager.stopBluetoothSco();

            }

            audioManager.setMode(AudioManager.MODE_NORMAL);
            audioManager.setSpeakerphoneOn(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

4. 如上操作后,每次即使应用选择了系统默认mic,也会走bt sco通道录音。

5. 当然,可能会遇到其他的优化问题,如果你有需求,欢迎给我留言。

Android 12 RK3588多应用录音适配是指在搭载Android 12操作系统的RK3588芯片平台上,实现多个应用程序同时进行录音的适配工作。 首先,Android 12为开发者提供了新的录音API,使得应用程序可以直接访问设备的录音功能。这些API允许应用程序获取麦克风输入并进行录音,并提供了诸如音频格式、编码器选择和文件输出等功能。在RK3588芯片平台上,开发者可以使用这些API来实现多个应用程序同时进行录音的需求。 其次,多应用录音适配需要对RK3588芯片平台的硬件进行适配。RK3588芯片平台通常搭载高性能的多核处理器和专业级音频芯片,这些硬件可以支持多个应用程序同时进行录音的需求。开发者需要确保录音API在RK3588芯片平台上的稳定性和兼容性,以保证多应用录音的正常使用。 此外,开发者还需要考虑多应用录音的隐私和安全问题。在Android 12中,录音权限被认为是一项敏感权限,需要用户明确授权才能被应用程序访问。开发者需要遵循Android 12的权限管理规则,确保用户在进行多应用录音时的隐私和安全得到有效的保障。 综上所述,Android 12 RK3588多应用录音适配需要开发者利用Android 12新的录音API,对RK3588芯片平台进行硬件适配,以及遵循权限管理规则,保障多应用录音的稳定性、兼容性、隐私和安全。这将为用户提供更好的录音体验,同时为开发者提供更大的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值