Android 12+:请求BLUETOOTH_CONNECT权限前如何检测蓝牙耳机是否连接
解决方案
针对Android 12+下需BLUETOOTH_CONNECT权限才能检测蓝牙耳机,但不想向无耳机用户发起权限请求的矛盾,可通过以下方式解决:
1. 用AudioManager检测蓝牙音频设备(无需权限)
Android 12+中,AudioManager的getDevices()方法可获取当前连接的音频设备,且无需蓝牙权限。用此方法先判断是否存在蓝牙音频设备:
private boolean hasBluetoothAudioDeviceConnected() { AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); AudioDeviceInfo[] devices = audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS); for (AudioDeviceInfo device : devices) { if (device.getType() == AudioDeviceInfo.TYPE_BLUETOOTH_A2DP || device.getType() == AudioDeviceInfo.TYPE_BLUETOOTH_SCO) { return true; } } return false; }
2. 监听蓝牙连接广播,动态触发权限申请
注册广播接收器监听蓝牙设备连接/断开事件,仅当检测到蓝牙音频设备连接时,才发起权限申请:
private static final int REQUEST_BLUETOOTH_CONNECT = 1001; private BroadcastReceiver bluetoothConnectionReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device != null && device.getBluetoothClass().hasService(BluetoothClass.Service.AUDIO)) { requestPermissions(new String[]{Manifest.permission.BLUETOOTH_CONNECT}, REQUEST_BLUETOOTH_CONNECT); } } } }; // 在onCreate中注册广播 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); registerReceiver(bluetoothConnectionReceiver, filter); } // 在onDestroy中注销广播 @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(bluetoothConnectionReceiver); }
3. 权限申请后的逻辑处理
用户授权后,调用你原有的检测方法确认状态,再处理WebRTC音频切换:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_BLUETOOTH_CONNECT) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (isBluetoothHeadsetConnected()) { // 执行WebRTC音频切换至蓝牙耳机的逻辑 } } } }
4. 处理应用启动时已连接耳机的场景
应用启动时若已有蓝牙音频设备连接,广播不会触发,可在启动时直接检测并申请权限:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ...其他初始化逻辑 if (hasBluetoothAudioDeviceConnected()) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.BLUETOOTH_CONNECT}, REQUEST_BLUETOOTH_CONNECT); } else { if (isBluetoothHeadsetConnected()) { // 执行音频切换逻辑 } } } }
内容的提问来源于stack exchange,提问作者Mike Keskinov
相关产品推荐
相关产品推荐

