刚拿到蓝牙的需求,是比较纠结的,因为比较急。所以给的时间不是很多。下面总结一下开发的步骤和遇到的一些问题及解决方法。
1.获得bluetoothAdapter
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
bluetoothAdapter = bluetoothManager.getAdapter();
2.开启蓝牙
bluetoothAdapter.isEnabled() 这段代码用来判断蓝牙是否开启。如果没有开启,调用下面的代码
Intent enableBtIntent = new Intent( BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, RESULT_OK);
3.扫描设备
public void scanLeDevice(boolean enable) {
if (enable) {
handler.postDelayed(new Runnable() {
@Override
public void run() {
bluetoothAdapter.stopLeScan(mLeScanCallback);
}
}, SCAN_PERIOD);
bluetoothAdapter.startLeScan(new UUID[] { SampleGattAttributes.SERVICE_UUID },mLeScanCallback);
} else {
bluetoothAdapter.stopLeScan(mLeScanCallback);
}
}
我这里需要获取给定UUID的设备,所以用了 bluetoothAdapter.startLeScan(new UUID[] { SampleGattAttributes.SERVICE_UUID },mLeScanCallback); 这个方法。 如果想要扫描周边的所有的蓝牙设备,可以调用bluetoothAdapter.startLeScan(mLeScanCallback); 这个方法。
在BluetoothAdapter.LeScanCallback 接口回调中,
private BluetoothAdapter.LeScanCallback mLeScanCallback = new LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice arg0, int arg1, byte[] arg2) {
runOnUiThread(new Runnable() {
@Override
public void run() {
myadapter.addDevice(arg0);
myadapter.notifyDataSetChanged();
// address = arg0.getAddress();
// if (mBluetoothLeService != null) {
// mBluetoothLeService.connect(address);
}
}
});
}
};
扫面到了设备就把该设备添加到list中,然后刷新适配器。
4.连接设备
这些做完之后,就需要连接你所要的蓝牙设备。
以下代码写在service中。
public boolean connect(String address) {
BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
if (device != null) {
mBluetoothGatt = device.connectGatt(this, false, mGattcallback);
}
return true;
}
在activity中调用service中的方法即可。至于怎么获取service的对象,就需要你自己写一个Binder去继承Binder,然后在里面写一个方法,返回Service对象。
class MyBinder extends Binder {
public BluetoothLeService getService() {
return BluetoothLeService.this;
}
}
然后,在onBinder方法里,然后你写的这个MyBinder对象即可。
然后就是比较重要的一个抽象类BluetoothGattCallback,在它里面有很多方法,这些方法用于回调。
方法onConnectionStateChange 在连接状态发生改变的时候会回调这个方法。
方法onCharacteristicRead 在调用mBluetoothGatt.readCharacteristic(mBluetoothGattCharacteristic)的时候会被调用。
方法onCharacteristicWrite 在调用mBluetoothGatt.writeCharacteristic(mBluetoothGattCharacteristic);的时候会被调用。
方法onCharacteristicChanged 在调用mBluetoothGatt.setCharacteristicNotification(gattCharacteristic, enable);之后,每调用mBluetoothGatt.writeCharacteristic(mBluetoothGattCharacteristic); 服务端就会返回一次设备数据给你,返回的数据就在onCharacteristicChanged 方法里面。
如果要获取数据,需要在onCharacteristicChanged 方法里面发送一个广播,然后在activity中接收广播,解析数据即可。
以上就是简单的开发步骤,高深的我也正在学习,与君共勉!~~