You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 04:17:12