依賴
implementation 'com.clj.fastble:FastBleLib:2.3.4'
必要權限 ( 請注意,一定要保證定位權限已開啟 )
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
OK,現(xiàn)在開始寫代碼
一些全局變量
private UUID uuid_service;
private UUID uuid_chara;
private BluetoothGatt bluetoothGatt;
掃描藍牙
/**
* 掃描藍牙
* */
private void startScanBle(){
/**
*
* 在使用之前,需要事先調用初始化init(Application app)方法。此外,可以進行一些自定義的配置,
* 比如是否顯示框架內(nèi)部日志,重連次數(shù)和重連時間間隔,以及操作超時時間。
*
* */
BleManager.getInstance().init(getApplication());
BleManager.getInstance()
.enableLog(true)
.setReConnectCount(1, 5000)
.setSplitWriteNum(20)
.setConnectOverTime(10000)
.setOperateTimeout(5000);
/**
*
* 判斷當前Android設備的藍牙是否已經(jīng)打開。
* 可以直接調用下面的判斷方法來判斷本機是否已經(jīng)打開了藍牙,如果沒有,向用戶拋出提示。
*
* */
if(!BleManager.getInstance().isBlueEnable()){
/**
* 開啟藍牙
* */
BleManager.getInstance().enableBluetooth();
}
/**
*
*配置掃描規(guī)則
* 掃描規(guī)則可以配置1個或多個,也可以不配置使用默認(掃描10秒)。
* 掃描的時候,會根據(jù)配置的過濾選項,對掃描到的設備進行過濾,結果返回過濾后的設備。
* 掃描時間配置為小于等于0,會實現(xiàn)無限掃描,直至調用BleManger.getInstance().cancelScan()來中止掃描。
*
* */
BleScanRuleConfig scanRuleConfig = new BleScanRuleConfig.Builder()
//.setServiceUuids(serviceUuids) // 只掃描指定的服務的設備,可選
//.setDeviceName(true, names) // 只掃描指定廣播名的設備,可選
//.setDeviceMac(mac) // 只掃描指定mac的設備,可選
//.setAutoConnect(isAutoConnect) // 連接時的autoConnect參數(shù),可選,默認false
.setScanTimeOut(10000) // 掃描超時時間,可選,默認10秒;小于等于0表示不限制掃描時間
.build();
BleManager.getInstance().initScanRule(scanRuleConfig);
/**
*
* 現(xiàn)在可以開始掃描了
*
* */
BleManager.getInstance().scan(new BleScanCallback() {
@Override
public void onScanFinished(List<BleDevice> scanResultList) {
// Toast.makeText(ScanBlueTooth.this,"掃描結束",Toast.LENGTH_LONG).show();
}
@Override
public void onScanStarted(boolean success) {
Toast.makeText(ScanBlueTooth.this,"開始尋找藍牙",Toast.LENGTH_LONG).show();
}
@Override
public void onScanning(BleDevice bleDevice) {
// 如果用listview或recyclerview 顯示可選擇設備的話
// bluetoothAdapter.addItem(bleDevice);
}
});
}
掃描后肯定就是連接了
// bleDevice 就是 onScanning 中掃描到的設備
BleManager.getInstance().connect(bleDevice, new BleGattCallback() {
@Override
public void onStartConnect() {
// 開始連接,這里可以彈出一個 progressDialog
}
@Override
public void onConnectFail(BleDevice bleDevice, BleException exception) {
// 掃描失敗,這里可以dimiss 掉 progressDialog
// 并且顯示連接失敗的具體原因
}
@Override
public void onConnectSuccess(BleDevice bleDevice, BluetoothGatt gatt, int status) {
// 連接成功后,就可以打開通知和發(fā)送指令了。
}
@Override
public void onDisConnected(boolean isActiveDisConnected, BleDevice device, BluetoothGatt gatt, int status) {
Toast.makeText(ScanBlueTooth.this,"連接中斷",Toast.LENGTH_LONG).show();
}
});
獲取uuid_service 和uuid_chara
bluetoothGatt = BleManager.getInstance().getBluetoothGatt(bleDevice);
/**
* 就是通過BluetoothGatt,查找出所有的Service和Characteristic的UUID:
* */
List<BluetoothGattService> serviceList = bluetoothGatt.getServices();
for (BluetoothGattService service : serviceList) {
uuid_service = service.getUuid();
List<BluetoothGattCharacteristic> characteristicList= service.getCharacteristics();
for(BluetoothGattCharacteristic characteristic : characteristicList) {
uuid_chara = characteristic.getUuid();
}
}
連接成功后打開通知,也就是用來接收來自藍牙傳輸過來的內(nèi)容
BleManager.getInstance().notify(
bleDevice,
uuid_service ,
uuid_chara,
new BleNotifyCallback() {
@Override
public void onNotifySuccess() {
// 打開通知操作成功
Log.i(TAG, "打開通知成功");
}
@Override
public void onNotifyFailure(BleException exception) {
// 打開通知操作失敗
}
@Override
public void onCharacteristicChanged(byte[] data) {
// 打開通知后,設備發(fā)過來的數(shù)據(jù)將在這里出現(xiàn)
}
});
發(fā)送藍牙指令
BleManager.getInstance().write(
bleDeviceBean.getBleDevice(),
bleDeviceBean.getUuid_service(),
bleDeviceBean.getUuid_write(),
"指令內(nèi)容",
new BleWriteCallback() {
@Override
public void onWriteSuccess(int current, int total, byte[] justWrite) {
// justWrite 為指令內(nèi)容
}
@Override
public void onWriteFailure(BleException exception) {
// 指令發(fā)送失敗
Log.i(TAG,exception.getDescription());
}
});