我有两个项目
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
在其中,我打电话使用(简化)扫描BT设备:
final BluetoothLeScanner scanner = BluetoothAdapter.getDefaultAdapter()
.getBluetoothLeScanner()
ArrayList<ScanFilter> scanFilters = ArrayList<>();
scanFilters.add(new ScanFilter.Builder()
.setServiceUuid(new ParcelUuid(MY_SERVICE_UUID))
.build());
ScanSettings scanSettings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build();
ScanCallback scanCallback = new ScanCallback() {
@Override
void onScanFailed(int errorCode) {}
@Override
void onScanResult(int callbackType, ScanResult result) {
result.getDevice().createBond();
scanner.stopScan(this);
}
@Override
public void onBatchScanResults(List<ScanResult> results) {}
};
scanner.startScan(scanFilters, scanSettings, scanCallback);
要点是我使用我的服务扫描设备,现在只需绑定到我看到的第一个设备。我的所有特征和描述符都使用了read / write_encrypted权限(我不知道这是否重要)。我最终看到的是两个设备上的配对屏幕,但后来当我使用connectGatt
方法时,我失败并出现以下错误:
E/bt_btif: bta_gattc_cache_load: can't open GATT cache file /data/misc/bluetooth/gatt_cache_76fe0b7bf8dd for reading, error: No such file or directory
E/bt_att: gatt_disc_cmpl_cback() - Unable to register for service changed indication
另一方面,如果我打开BT设置并从那里绑定设备,一切都很好! connectGatt
可以工作,我可以随意读/写数据。
createBond()
我做错了什么?
答案 0 :(得分:2)
似乎调用BluetoothDevice.createBond()
使用BluetoothDevice.TRANSPORT_AUTO
来创建绑定。这并不适用于所有Android平台并且很脆弱。相反,使用用于扫描设备的特定传输进行呼叫就可以了。
device.createBond(BluetoothDevice.TRANSPORT_LE)