Pre Marshmallow我的应用会通过BluetoothAdapter.getDefaultAdapter().getAddress().
现在使用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地址?
答案 0 :(得分:38)
zmarties是正确的,但你仍然可以通过反射或Settings.Secure获取mac地址:
String macAddress = android.provider.Settings.Secure.getString(context.getContentResolver(), "bluetooth_address");
答案 1 :(得分:12)
故意删除了对mac地址的访问权限:
为了向用户提供更好的数据保护,从此版本开始,Android会删除使用Wi-Fi和蓝牙API的应用程序对设备本地硬件标识符的编程访问。
答案 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;
}