Android 14中Bluetooth Adapter启用/禁用失效问题求助
Android 14 蓝牙开关控制失效解决方案
问题根源
Android 12(API 31)开始,BluetoothAdapter.enable()和BluetoothAdapter.disable()就已被标记为弃用,Android 14(API 34)中系统完全禁止第三方应用直接调用这两个方法修改蓝牙状态——这是系统的安全限制,目的是防止应用未经用户许可篡改蓝牙开关状态。
正确实现方案
第三方应用必须通过系统提供的Intent,引导用户手动确认蓝牙的开启/关闭操作,以下是具体实现步骤:
1. 权限配置
确保AndroidManifest.xml中已添加必要权限:
<!-- 兼容Android 11及以下版本 --> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <!-- Android 12+ 蓝牙连接权限(危险权限,需动态申请) --> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <!-- 声明设备支持蓝牙(可选) --> <uses-feature android:name="android.hardware.bluetooth" android:required="false" />
2. 动态申请蓝牙权限
Android 12+ 需动态申请BLUETOOTH_CONNECT权限:
private const val REQUEST_BLUETOOTH_PERMISSIONS = 1001 private fun checkBluetoothPermissions() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.BLUETOOTH_CONNECT), REQUEST_BLUETOOTH_PERMISSIONS) } } }
3. 开启蓝牙实现
使用ACTION_REQUEST_ENABLE Intent唤起系统确认弹窗:
// 注册Activity结果回调 private val enableBtLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> when (result.resultCode) { Activity.RESULT_OK -> { // 用户同意开启蓝牙,执行后续逻辑 } Activity.RESULT_CANCELED -> { // 用户拒绝开启蓝牙 } } } fun enableBluetooth() { val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter() ?: run { // 设备不支持蓝牙 return } if (!bluetoothAdapter.isEnabled) { val enableIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) enableBtLauncher.launch(enableIntent) } }
4. 关闭蓝牙实现
使用ACTION_REQUEST_DISABLE Intent唤起系统确认弹窗:
// 注册Activity结果回调 private val disableBtLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> when (result.resultCode) { Activity.RESULT_OK -> { // 用户同意关闭蓝牙,执行后续逻辑 } Activity.RESULT_CANCELED -> { // 用户拒绝关闭蓝牙 } } } fun disableBluetooth() { val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter() ?: run { // 设备不支持蓝牙 return } if (bluetoothAdapter.isEnabled) { val disableIntent = Intent(BluetoothAdapter.ACTION_REQUEST_DISABLE) disableBtLauncher.launch(disableIntent) } }
5. Java版本参考
private static final int REQUEST_ENABLE_BT = 1002; private static final int REQUEST_DISABLE_BT = 1003; // 开启蓝牙 public void enableBluetooth() { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) return; if (!bluetoothAdapter.isEnabled()) { Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableIntent, REQUEST_ENABLE_BT); } } // 关闭蓝牙 public void disableBluetooth() { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) return; if (bluetoothAdapter.isEnabled()) { Intent disableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISABLE); startActivityForResult(disableIntent, REQUEST_DISABLE_BT); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_ENABLE_BT) { if (resultCode == RESULT_OK) { // 蓝牙开启成功 } } else if (requestCode == REQUEST_DISABLE_BT) { if (resultCode == RESULT_OK) { // 蓝牙关闭成功 } } }
特殊场景说明
如果你的应用是系统签名应用,可以使用BluetoothManager.setBluetoothEnabled()方法直接控制蓝牙状态,但该接口仅对系统应用开放,第三方应用无法调用。
内容的提问来源于stack exchange,提问作者ANUJ
相关产品推荐
相关产品推荐

