Android蓝牙开发BLE-蓝牙连接
发布时间
阅读量:
阅读量
刚开始接触蓝牙,很多不明白不清楚,决定写点东西记录下。
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语句体内有两个判断条件:其一是当我在操作过程中遇到了许多未命名的蓝牙设备,并不知情的情况下便进行了长度校验;其二是为了避免添加重复的蓝牙设备而设置了相应的限制措施。
连接蓝牙
例如在我的设备中
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方法包含三个关键配置项:第一个用于传递上下文信息;第二个布尔类型设置决定了后续操作流程的方向;第三个配置项指定了完成操作后应触发的动作。
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: ========》》连接成功");
}
}
};
看来已经接近成功了

全部评论 (0)
还没有任何评论哟~
