在 Android 12 中获取蓝牙 MAC 地址的指南

在 Android 12 及之后的版本中,直接访问蓝牙 MAC 地址被限制以保护用户隐私。但是,你仍可以通过特定的 API 获取蓝牙功能的相关信息。接下来,我们将逐步了解如何在 Android 12 中获取蓝牙相关信息,包括蓝牙 MAC 地址。

整体流程

以下是获取蓝牙 MAC 地址的流程:

步骤 描述
步骤 1 检查权限
步骤 2 获取 BluetoothAdapter
步骤 3 获取蓝牙设备信息
步骤 4 处理蓝牙状态和设备连接

步骤详解

步骤 1: 检查权限

在 Android 12 中,你需要在 AndroidManifest.xml 文件中声明必要的权限。确保添加如下权限:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

然后,在你的活动中检查这些权限:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, REQUEST_CODE);
}

步骤 2: 获取 BluetoothAdapter

获取 BluetoothAdapter 以便进行后续操作:

BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// 检查设备是否支持蓝牙
if (bluetoothAdapter == null) {
    // 设备不支持蓝牙
    Log.e("Bluetooth", "Device doesn't support Bluetooth");
}

步骤 3: 获取蓝牙设备信息

虽然在 Android 12 中不能直接获取设备的 MAC 地址,但你可以通过 BluetoothAdapter 和相关 API 来获取设备列表。

获取已配对设备并输出其基本信息:

Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
if (pairedDevices.size() > 0) {
    for (BluetoothDevice device : pairedDevices) {
        String deviceName = device.getName(); // 获取设备名称
        String deviceAddress = device.getAddress(); // 获取设备 MAC 地址 (部分功能受限)
        Log.i("BluetoothDevice", "Name: " + deviceName + ", Address: " + deviceAddress);
    }
}

步骤 4: 处理蓝牙状态和设备连接

最后,你可以设置 BroadcastReceiver 监控蓝牙状态,如蓝牙开启、关闭或设备连接状态:

private final BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
            // 处理配对状态变化
            final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);
            if (state == BluetoothDevice.BOND_BONDED) {
                // 设备已连接
            }
        }
    }
};

// 注册广播接收器
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
registerReceiver(receiver, filter);

类图

为了更清晰地展示代码结构,以下是类图示例:

classDiagram
    class MainActivity {
        +void checkPermissions()
        +void initBluetoothAdapter()
        +void getPairedDevices()
        +void registerBluetoothReceiver()
    }
    class BluetoothReceiver {
        +void onReceive(Context context, Intent intent)
    }
    MainActivity --> BluetoothReceiver : uses

结尾

在 Android 12 中,获取蓝牙 MAC 地址变得更加复杂,主要是为了保护用户隐私。然而,通过合适的工作流程和正确的 API 调用,你依然可以获取蓝牙设备的相关信息。记得始终检查和请求必要的权限,这对于蓝牙功能的正常运行至关重要。

希望这篇文章对你有帮助,祝你在 Android 开发中取得更大的进展!