我正在扫描蓝牙低功耗设备并作为外围设备运行(在Moto G 2nd Gen上运行Android 6.0)。
我的问题是有时候(似乎是随机的但经常出现),它找不到我的其他外围设备,而其他时候它可以正常工作。
我有一个iOS设备运行类似的代码(都在扫描外围设备并作为外围设备运行),当Android扫描无法找到iOS设备时,我的iOS可以很好地找到充当外围设备的Android设备。因此,这似乎只是一个扫描方面的问题。
它不仅仅是找不到我的iOS设备,而且找不到任何蓝牙设备。当它工作时,它会发现我的iOS设备以及一堆其他设备。
我已经尝试使用和不使用ScanFilters,但得到了相同的问题。 我正在使用SDK 26构建,最低SDK为23。
我设置了所需的权限,因为有时它可以正常工作。
下面是相关代码:
private void startScanning() {
mHandler = new Handler(mContext.getMainLooper());
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.setReportDelay(0)
.build();
mBluetoothLeScanner.startScan(null, settings, mScanCallback);
}
}, 1000);
}
private ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
if( result == null || result.getDevice() == null )
return;
Log.e("myTest", "Found Device");
BluetoothDevice device = result.getDevice();
final String deviceAddress = device.getAddress();
List<ParcelUuid> parcel = result.getScanRecord().getServiceUuids();
if (parcel != null) {
String parcelUUID = parcel.toString().substring(1,37);
if (parcelUUID.equalsIgnoreCase(mContext.getString(R.string.service_uuid))) {
final BluetoothDevice bleDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(deviceAddress);
if (!seenPeripherals.contains(deviceAddress)) {
stopScanning();
mHandler = new Handler(mContext.getMainLooper());
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Log.e("AppToApp", "Trying to connect to device " + deviceAddress);
mGatt = bleDevice.connectGatt(mContext, false, mGattCallback);
}
}, 1000);
}
}
}
}
}