在Marshmallow获取蓝牙本地mac地址

时间:2015-10-27 20:35:40

标签: android bluetooth mac-address android-6.0-marshmallow

Pre Marshmallow我的应用会通过BluetoothAdapter.getDefaultAdapter().getAddress().

获取设备的MAC地址

现在使用Marshmallow Android正在返回02:00:00:00:00:00

我看到一些链接(抱歉不知道现在在哪里)说你需要添加额外的权限

<uses-permission android:name="android.permission.LOCAL_MAC_ADDRESS"/> 

能够得到它。但它不适合我。

获取mac地址需要一些额外的权限吗?

我不确定这是否相关,但清单还包括

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

那么有没有办法获得本地蓝牙mac地址?

9 个答案:

答案 0 :(得分:38)

zmarties是正确的,但你仍然可以通过反射或Settings.Secure获取mac地址:

  String macAddress = android.provider.Settings.Secure.getString(context.getContentResolver(), "bluetooth_address");

答案 1 :(得分:12)

故意删除了对mac地址的访问权限:

  

为了向用户提供更好的数据保护,从此版本开始,Android会删除使用Wi-Fi和蓝牙API的应用程序对设备本地硬件标识符的编程访问。

(来自Android 6.0 Changes

答案 2 :(得分:4)

您可以从文件中访问Mac地址 的&#34; / SYS /类/净/&#34; + networkInterfaceName +&#34; / address&#34; ,其中networkInterfaceName可以是wlan0或eth1.But它的权限可能是读保护的,因此它可能在某些设备中不起作用。 我还附上了我从SO获得的代码部分。

public static String getWifiMacAddress() {
        try {
            String interfaceName = "wlan0";
            List<NetworkInterface> interfaces = Collections
                    .list(NetworkInterface.getNetworkInterfaces());
            for (NetworkInterface intf : interfaces) {
                if (!intf.getName().equalsIgnoreCase(interfaceName)) {
                    continue;
                }

                byte[] mac = intf.getHardwareAddress();
                if (mac == null) {
                    return "";
                }

                StringBuilder buf = new StringBuilder();
                for (byte aMac : mac) {
                    buf.append(String.format("%02X:", aMac));
                }
                if (buf.length() > 0) {
                    buf.deleteCharAt(buf.length() - 1);
                }
                return buf.toString();
            }
        } catch (Exception exp) {

            exp.printStackTrace();
        } 
        return "";
    }

答案 3 :(得分:4)

首先,以下权限必须添加到清单中;

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.LOCAL_MAC_ADDRESS" />

然后

public static final String SECURE_SETTINGS_BLUETOOTH_ADDRESS = "bluetooth_address";

String macAddress = Settings.Secure.getString(getContentResolver(), SECURE_SETTINGS_BLUETOOTH_ADDRESS);

此后,必须使用OEM /系统密钥对应用程序进行签名。在Android 8.1.0上进行了测试和验证。

答案 4 :(得分:3)

请使用以下代码获取蓝牙mac地址。如果有任何问题,请告诉我。

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;
}

答案 5 :(得分:2)

通过反射获取MAC地址可能如下所示:

private static String getBtAddressViaReflection() {
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    Object bluetoothManagerService = new Mirror().on(bluetoothAdapter).get().field("mService");
    if (bluetoothManagerService == null) {
        Log.w(TAG, "couldn't find bluetoothManagerService");
        return null;
    }
    Object address = new Mirror().on(bluetoothManagerService).invoke().method("getAddress").withoutArgs();
    if (address != null && address instanceof String) {
        Log.w(TAG, "using reflection to get the BT MAC address: " + address);
        return (String) address;
    } else {
        return null;
    }
}

使用反射库(net.vidageek:mirror),但你会明白这一点。

答案 6 :(得分:1)

由于下面的方法为android O返回null。

String macAddress = android.provider.Settings.Secure.getString(context.getContentResolver(), "bluetooth_address");

我找到了获取蓝牙 Mac 地址的新方法,您可以使用以下命令行尝试。

su strings /data/misc/bluedroid/bt_config.conf | grep Address

注意:就我而言,我使用的是根设备,因此我的应用程序具有超级用户权限。

答案 7 :(得分:0)

事实证明,我最终没有从Android获取MAC地址。蓝牙设备最终提供Android设备MAC地址,该地址已存储,然后在需要时使用。是的,它似乎有点时髦,但在我所参与的项目中,蓝牙设备软件也正在开发中,这被证明是处理这种情况的最佳方式。

答案 8 :(得分:0)

工作出色

 private String getBluetoothMacAddress() {
        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        String bluetoothMacAddress = "";
        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 | NoSuchMethodException | IllegalAccessException | InvocationTargetException ignore) {

        }
        return bluetoothMacAddress;
    }