最近在做蓝牙开发,主要就是拿到自己的蓝牙Mac地址,和扫描到周围的蓝牙设备,之前没有接触过蓝牙开发这方面的知识,本以为挺简单的,但是没想到还是遇到了几个比较棘手的问题,写出来和大家分享以下
Android中的蓝牙
说到Android中的蓝牙,大家听到的可能有蓝牙1.0、蓝牙2.0、蓝牙3.0、蓝牙4.0之类的以数字结尾的蓝牙版本号,而实际上,在最新的标准中,已经不再使用数字版本号作为蓝牙版本的区分了,取而代之的是经典蓝牙与低功耗蓝牙(BLE)这两种区别。这里提到的低功耗蓝牙也会有很多人会误解为就是蓝牙4.0,但是完整的蓝牙4.0规范中实际上包括有经典蓝牙和低功耗蓝牙这两个部分
经典蓝牙:蓝牙最初的设计意图,是打电话放音乐。3.0版本以下的蓝牙,都称为“经典蓝牙”。功耗高、传输数据量大、传输距离只有10米。
低功耗蓝牙:就是BLE,通常说的蓝牙4.0(及以上版本)。低功耗,数据量小,距离50米左右。
经典蓝牙:经典蓝牙设备发现其它经典蓝牙设备的方式是调用BluetoothAdapter的startDiscovery()方法。
谷歌的官方api上说的比较模糊,大致是说只能够发现经典蓝牙设备。(巨坑)
BluetoothAdapter adapter = (BluetoothAdapter) getApplicationContext().getSystemService(BLUETOOTH_SERVICE);
//安卓6以后的版本使用此方法拿不到真实的MAC地址
String macAddr = adapter.getAddress();
6.0以上系统(不包含8.1以上的系统)可以通过反射的这种方式拿到Mac
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;
}
但是呢8.1或者9.0以上的手机想拿到自己的mac地址怎么办呢
抱着出去看看的态度,详细的去查看了谷歌的官方文档,然后又去Stack Overflow 上去咨询了一些大牛,发现谷歌已经把这种方式给紧掉了,
很无奈,最终也没解决了这个问题,最后采取了一种让用户自己输入自己的MAC地址的方法暂时能用。期待有人能给解决掉这个问题,告诉我一声万分感谢