Android перестает находить устройства BLE: onClientRegistered () - status=133 clientIf=0
я разрабатываю приложение, в котором я могу найти и настроить BLE устройства. Я использую стандартный Android BLE API, но в последнее время я столкнулся с некоторыми странными проблемами.
когда я включаю свое приложение, сканирование BLE работает нормально. Я сканирую с помощью:
mBluetoothAdapter.startLeScan(mLeScanCallback); // for Kitkat and below
и
mBluetoothAdapter.getBluetoothLeScanner().startScan(mScanCallback); // for Lollipop and above
в Logcat я получаю следующие сообщения (я думаю, это важно для этой проблемы):
D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
в моем приложении я также могу прочитать некоторые характеристики из моих устройств BLE (например. состояние батареи). Я подключаюсь к устройству, чтобы прочитать эту характеристику в отдельном фрагменте, используя:
mBluetoothManager = (BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = mBluetoothManager.getAdapter();
mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(mMacAddress);
mBluetoothGatt = mBluetoothDevice.connectGatt(mContext, false, mGattCallback);
характеристики прочитаны правильно. В onCharacteristicRead обратный вызов я также отключаю и закрываю Gatt:
mBluetoothGatt.disconnect();
mBluetoothGatt.close();
каждый раз, когда я открываю фрагмент, чтобы прочитать характеристику (независимо от того, является ли это одно и то же устройство или нет) clientIf увеличивает значение. Я вижу в LogCat:
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=6
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=7
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=8
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=9
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=10
все работает нормально, пока clientIf значение равно 10. Сканирование BLE перестает находить какие-либо устройства, я не могу подключиться ни к одному из моих устройств для чтения каких-либо характеристик и т. д. И LogCat бесконечно отображает эти сообщения:
D/BluetoothGatt: unregisterApp() - mClientIf=0
D/BluetoothGatt: onClientRegistered() - status=133 clientIf=0
единственный способ исправить это-убить приложение и перезапустить его или перезапустить Bluetooth, выключив и включив его вручную. Я столкнулся с этой проблемой только на некоторых устройствах, таких как Xperia Z1 (Android KitKat) и Galaxy S4 (Android Lollipop). Я не мог воспроизвести эту проблему на Xperia Z3 Компактный работает Android зефир...
могу ли я что-нибудь с этим поделать? Я уже пробовал несколько "решений", таких как - вызов всех методов BLE из потока пользовательского интерфейса и закрытие/отключение GATT, но ничего не помогает. Как я могу это исправить?
2 ответов
Я отвечу на свой вопрос, потому что, вероятно, это поможет кому-то с той же проблемой.
прежде всего, я не мог решить проблему с Bluetooth сбой после mClientIf стоимостью 10. Однако я нашел обходной путь, который помог в моем случае.
хотя я останавливал поиск маяка в первом Fragment и начальная характеристика прочитана в другом, BLE API, по-видимому, не остановил поиск сразу и после открытия следующего Fragment в система создавала еще одного "клиента".
вот почему мне нужно подождать некоторое время после выхода из первого Fragment и перед тем, как начать читать характеристику в другом.
этот метод называется onCreateView "новый" Fragment (через postDelayed помог мне решить проблему):
private void getBatteryCharacteristic() {
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
mBeaconBatteryStateReader = new BeaconBatteryStateReader(
BeaconDetailsActivity.this,
mBeacon.getMacAddress());
mBeaconBatteryStateReader.readBatteryState(BeaconDetailsActivity.this);
}
}, 100);
}
закрытие объекта gatt является правильным способом освобождения ресурсов. Если он все еще не работает там ошибка в Android на этом конкретном телефоне.
чтобы свести к минимуму вероятность достижения предела, вы можете убедиться, что у вас никогда не будет более одного объекта gatt на устройство.