Android提供BluetoothAdapter类蓝牙通信。通过调用创建的对象的静态方法getDefaultAdapter()。其语法如下给出。
private BluetoothAdapter BA;
BA = BluetoothAdapter.getDefaultAdapter();方法一
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
为了使用设备的蓝牙,调用下列蓝牙ACTION_REQUEST_ENABLE的意图。其语法如下:
Intent turnOn= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(turnOn, 0);
除了这个常量,有提供其它的API,支持不同任务的其他常数。它们在下面列出。
Sr.No | 常数说明 |
1 | ACTION_REQUEST_DISCOVERABLE |
2 | ACTION_STATE_CHANGED |
3 | ACTION_FOUND |
启用了蓝牙功能之后,可以通过调用 getBondedDevices()方法来获取配对设备列表。它返回一组的蓝牙设备。其语法如下:
private Set<BluetoothDevice>pairedDevices;
pairedDevices= BA.getBondedDevices();
除了配对的设备,还有API,让更多蓝牙控制权等方法。它们在下面列出。
Sr.No | 方法及说明 |
1 | enable() |
2 | isEnabled() |
3 | disable() |
4 | getName() |
5 | setName(String name) |
6 | getState() |
7 | startDiscovery() |
蓝牙权限
android.permission.BLUETOOTH : 允许程序连接到已配对的蓝牙设备,请求连接/接收/传输数据需要改权限,主要用于对配对后进行操作;
android.permission.BLUETOOTH_ADMIN : 允许程序发现和配对蓝牙设备,该权限用来管理蓝牙设备,有了这个权限,应用才能使用本机的蓝牙设备,主要用于对配对前的操作;
优先级 : BLUETOOTH权限是BLUETOOTH_ADMIN权限的前提,如果没有BLUETOOTH权限,就不能使用BLUETOOTH_ADMIN权限;
除了蓝牙权限外,如果需要BLE feature则还需要声明uses-feature:
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
按时required为true时,则应用只能在支持BLE的Android设备上安装运行;required为false时,Android设备均可正常安装运行,需要在代码运行时判断设备是否支持BLE feature:
// Use this check to determine whether BLE is supported on the device. Then
// you can selectively disable BLE-related features.
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
finish();
}
UUID
1.1 认识一下 UUID UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会(Open Software Foundation, OSF) 的组织应用在分布式计算环境(Distributed Computing Environment, DCE)领域的一部分。
在蓝牙 3.0 及以下版本中,UUID被用于唯一标识一个服务,比如文件传输服务,串口 服务、打印机服务等,如下:
蓝牙串口服务
SerialPortServiceClass_UUID = ‘{00001101-0000-1000-8000-00805F9B34FB}’
LANAccessUsingPPPServiceClass_UUID = ‘{00001102-0000-1000-8000-00805F9B34FB}’
拨号网络服务
DialupNetworkingServiceClass_UUID = ‘{00001103-0000-1000-8000-00805F9B34FB}’
信息同步服务
IrMCSyncServiceClass_UUID = ‘{00001104-0000-1000-8000-00805F9B34FB}’SDP_OBEXObjectPushServiceClass_UUID = ‘{00001105-0000-1000-8000-00805F9B34FB}’
文件传输服务
OBEXFileTransferServiceClass_UUID = ‘{00001106-0000-1000-8000-00805F9B34FB}’IrMCSyncCommandServiceClass_UUID = ‘{00001107-0000-1000-8000-00805F9B34FB}’
蓝牙的连接有主从设备,提供服务的可以认为是从设备。主设备通过 UUID 访问从设备 提供具有相同 UUID 的服务,从而建立客服端—服务器(C/S)模式。
如果你只需要搜索指定UUID的外设,你可以调用 startLeScan(UUID[], BluetoothAdapter.LeScanCallback)方法。
其中UUID数组指定你的应用程序所支持的GATT Services的UUID。
BluetoothAdapter.LeScanCallback的实现示例如下:
private LeDeviceListAdapter mLeDeviceListAdapter;
...
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi,
byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mLeDeviceListAdapter.addDevice(device);
mLeDeviceListAdapter.notifyDataSetChanged();
}
});
}
};
注意:搜索时,你只能搜索传统蓝牙设备或者BLE设备,两者完全独立,不可同时被搜索。
Android中进行蓝牙开发需要使用到的类的执行过程是:
1、使用BluetoothAdapter.startLeScan来扫描低功耗蓝牙设备
2、在扫描到设备的回调函数中会得到BluetoothDevice对象,
并使用BluetoothAdapter.stopLeScan停止扫描
3、使用BluetoothDevice.connectGatt来获取到BluetoothGatt对象
4、执行BluetoothGatt.discoverServices,这个方法是异步操作,在回调函数onServicesDiscovered中得到status,通过判断status是否等于BluetoothGatt.GATT_SUCCESS来判断查找Service是否成功
5、如果成功了,则通过BluetoothGatt.getService来获取BluetoothGattService
6、接着通过BluetoothGattService.getCharacteristic获取BluetoothGattCharacteristic
然后通过BluetoothGattCharacteristic.getDescriptor获取BluetoothGattDescriptor