关于Andorid O版本获取不到蓝牙地址的说明

之前提到过获取系统的蓝牙地址,最近发现在Anroid O版本上出现了无法获取的现象。经过不断查询,发现了解决方法是替换成下面的方案:
private String getBluetoothMacAddress() {
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    String bluetoothMacAddress = "";
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
        try {
            Field mServiceField = bluetoothAdapter.getClass().getDeclaredField("mService");
            mServiceField.setAccessible(true);

            Object btManagerService = mServiceField.get(bluetoothAdapter);

            if (btManagerService != null) {
                bluetoothMacAddress = (String) btManagerService.getClass().getMethod("getAddress").invoke(btManagerService);
            }
        } catch (NoSuchFieldException e) {

        } catch (NoSuchMethodException e) {

        } catch (IllegalAccessException e) {

        } catch (InvocationTargetException e) {

        }
    } else {
        bluetoothMacAddress = bluetoothAdapter.getAddress();
    }
    return bluetoothMacAddress;
}

原因在于在8.0版本上关于系统的权限做了更为严格的要求,原有的通过Secure的映射获取的方式已经被舍弃。目前通过BluetoothManagerService的反射获取可以得到BT mac地址。

参考

你可能感兴趣的:(android,marshmallow,bluetooth)