在Marshmallow获取蓝牙本地mac地址

Eri*_*ric 25 android mac-address bluetooth android-6.0-marshmallow

Pre Marshmallow我的应用程序将获得它的设备MAC地址 BluetoothAdapter.getDefaultAdapter().getAddress().

现在有了Marshmallow Android正在回归02:00:00:00:00:00.

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

<uses-permission android:name="android.permission.LOCAL_MAC_ADDRESS"/> 
Run Code Online (Sandbox Code Playgroud)

能够得到它.但它对我不起作用.

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

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

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Run Code Online (Sandbox Code Playgroud)

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

小智 39

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

  String macAddress = android.provider.Settings.Secure.getString(context.getContentResolver(), "bluetooth_address");
Run Code Online (Sandbox Code Playgroud)

  • android.provider.Settings.Secure.getString(context.getContentResolver(), "bluetooth_address") 在 Android 10 中返回 null (4认同)
  • @Rilwan将反射用于隐藏/列入黑名单的API会使应用程序在下次操作系统更新时崩溃,并且它永远不是正确的解决方案,只是暂时的解决方法。 (2认同)

zma*_*ies 12

有意删除了对mac地址的访问:

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

(来自Android 6.0的更改)

  • LOCAL_MAC_ADDRESS权限只能由系统应用程序使用,Google不太可能更改它. (3认同)
  • 是.我读过那个.但是API 23 BluetoothAdapter具有以下内容:/***向没有*android.permission.LOCAL_MAC_ADDRESS权限的客户端报告的默认MAC地址.**@hide*/public static final String DEFAULT_MAC_ADDRESS ="02:00:00:00:00:00"; 所以这意味着有一些方法可以实现它.(也许还没有实现?我坚持希望.) (2认同)

小智 5

您可以从文件“ / sys / class / net /” + networkInterfaceName +“ / address”访问Mac地址 ,其中networkInterfaceName可以是wlan0或eth1。但是其权限可能是受读保护的,因此在某些设备上可能无法使用。我还要附上我从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 "";
    }
Run Code Online (Sandbox Code Playgroud)

  • 同样,Android N及更高版本也将使用此方法返回错误的MAC地址。 (5认同)

小智 5

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

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.LOCAL_MAC_ADDRESS" />
Run Code Online (Sandbox Code Playgroud)

然后,

public static final String SECURE_SETTINGS_BLUETOOTH_ADDRESS = "bluetooth_address";

String macAddress = Settings.Secure.getString(getContentResolver(), SECURE_SETTINGS_BLUETOOTH_ADDRESS);
Run Code Online (Sandbox Code Playgroud)

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


Eri*_*ric 0

事实证明,我最终没有从 Android 获得 MAC 地址。蓝牙设备最终提供 Android 设备 MAC 地址,该地址被存储并在需要时使用。是的,这看起来有点奇怪,但在我参与的项目中,蓝牙设备软件也在开发中,事实证明这是处理这种情况的最佳方法。