BLE onServicesDiscovered() не возвращает массив характеристик
Я реализовал BLE Central в моем приложении. Шаги:
Получить BluetoothManager
mBluetoothManager = (BluetoothManager) mContext.getSystemService (Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = mBluetoothManager.getAdapter ();
Сканирование для устройств
Подключить устройство
mGatt = bluetoothDevice.connectGatt(this, false, gattCallback);
Обработка обратного вызова и запуск обнаружения службы
После подключения устройства я звоню, чтобы узнать об услугах.
gatt.discoverServices();
Как только услуги обнаружены, я ловлю это в
private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
Log.i("onConnectionStateChange", "Status: " + status);
switch (newState) {
case BluetoothProfile.STATE_CONNECTED:
Log.i("gattCallback", "STATE_CONNECTED");
gatt.discoverServices();
break;
case BluetoothProfile.STATE_DISCONNECTED:
mGatt = null;
mBluetoothSingleTonClass.saveGatt(mGatt);
deviceDisconnected();
Log.e("gattCallback", "STATE_DISCONNECTED");
break;
case BluetoothProfile.STATE_CONNECTING :
Log.e("gattCallback", "STATE_CONNECTING");
break;
default:
Log.e("gattCallback", "STATE_OTHER");
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
List<BluetoothGattService> services = new ArrayList<>();
services.addAll(gatt.getServices());
Log.d("onServicesDiscovered", "uuid::" + gatt.getServices().get(0).getUuid());
Log.d("onServicesDiscovered", "uuid::" + gatt.getServices().get(1).getUuid());
Log.d("onServicesDiscovered", "uuid::" + gatt.getServices().get(2).getUuid());
Log.d("onServicesDiscovered", "chars::" + gatt.getServices().get(2).getCharacteristics().size());
Log.d("onServicesDiscovered", "chars::" + gatt.getServices().get(0).getCharacteristics().size());
Log.d("onServicesDiscovered", "chars::" + gatt.getServices().get(1).getCharacteristics().size());
}
};
Проблема в том, что Гатт предоставляет мне все сервисы, которые есть у устройства, но он дает пустой массив характеристик в нескольких мобильных устройствах. Пример: gatt.getServices().get(0).getCharacteristics().size()
Это хорошо работало в Nexus, но через несколько дней он дает мне пустой массив, то есть размер равен нулю. Я делаю что-то не так? Это проблема с мобильным? Любые ссылки будут полезны.
2 ответа
Это может дать пустой (или слишком короткий) список, если устройство отключается во время процедуры обнаружения. Вы должны проверить код состояния в обратном вызове и только предположить, что услуги действительны, если это 0 (УСПЕХ).
задержка 600 мс для вызова gatt.discoverServices() разрешить эту проблему