Android蓝牙开发BLE-蓝牙连接
程序员文章站
2024-03-24 23:58:04
...
刚开始接触蓝牙,很多不明白不清楚,决定写点东西记录下。
1.权限
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
其中ACCESS_FINE_LOCATION这个权限是危险权限,需要动态获取的。
2.扫描蓝牙
扫描
直接撸代码
ArrayList<BluetoothDevice> list_device=new ArrayList<>(); //蓝牙设备
Handler mHandler=new Handler();
BluetoothAdapter mAdapter;
int time=20000; //蓝牙扫描时长
ListView mListView;
public void scan() {
BluetoothManager bluetoothManager= (BluetoothManager)getSystemService(BLUETOOTH_SERVICE);
mAdapter=bluetoothManager.getAdapter(); //获取蓝牙适配器
if (!mAdapter.isEnabled()){ //如果蓝牙未打开,打开蓝牙
Intent intent=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(intent);
}
final BluetoothLeScanner scanner=mAdapter.getBluetoothLeScanner(); //获取BluetoothLeScanner对象
scanner.startScan(callback); //开始扫描,扫描的结果在callback里面处理
mHandler.postDelayed(new Runnable() { //20秒后停止扫描,在callback里获取扫描结果
@Override
public void run() {
scanner.stopScan(callback);
}
},time);
}
蓝牙扫描,我觉得非常关键的回调类是ScanCallback
,实现它的两个方法,第三个方法干嘛的我也不清楚,就不说了。
ScanCallback callback=new ScanCallback() { //扫描回调
@Override
public void onScanResult(int callbackType, ScanResult result) { //找到设备
super.onScanResult(callbackType,result);
//在这里面对你扫描到的蓝牙设备进行操作
//我的代码(写的不好,多指正)
ScanRecord scanRecord = result.getScanRecord(); //获取扫描记录
if ((result.getDevice().getName()+"l").length()>5&&list_device.indexOf(result.getDevice())==-1){ //加入到list中
list_device.add(result.getDevice());
}
Log.d(TAG, "onScanResult: "+list_device.size());
String[] btName=new String[list_device.size()];
for (int i = 0; i <list_device.size() ; i++) {
btName[i]=list_device.get(i).getName();
}
ArrayAdapter<String> adapter=new ArrayAdapter<>(MainActivity.this,android.R.layout.simple_list_item_1,btName);
mListView.setAdapter(adapter);
}
@Override
public void onScanFailed(int errorCode) { //没有开启扫描
super.onScanFailed(errorCode);
}
};
在上面if语句中,第一个判断是我在操作的时候有很多没有名字的蓝牙,我也不知道咋回事,就加个长度判断,第二个是不加入重复的蓝牙设备。
连接蓝牙
以我的为例,我把扫描到的蓝牙设备放入了集合,然后获取设备名显示在listview上。给listview添加一个监听事件,单击就连接蓝牙即可。
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
BluetoothDevice bluetoothDevice = list_device.get(i);
bluetoothDevice.connectGatt(MainActivity.this,true,mBluetoothGattCallback);
}
});
connectGatt
方法有三个参数,第一个context,第二个Boolean值,是否自动连接,第三个是回调函数
BluetoothGattCallback mBluetoothGattCallback=new BluetoothGattCallback() { //连接回调
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
super.onConnectionStateChange(gatt, status, newState);
if (status==BluetoothGatt.GATT_SUCCESS) {
Log.d(TAG, "onConnectionStateChange: ========》》连接成功");
}
}
};
到这应该就是成功了吧,我也不确定,等我写下一篇收发的时候就知道了。哈哈
上一篇: 链表实现队列出队和入队