BLE onServicesDiscovered() не возвращает массив характеристик

Я реализовал BLE Central в моем приложении. Шаги:

  1. Получить BluetoothManager

    mBluetoothManager = (BluetoothManager) mContext.getSystemService (Context.BLUETOOTH_SERVICE);

    mBluetoothAdapter = mBluetoothManager.getAdapter ();

  2. Сканирование для устройств

  3. Подключить устройство

    mGatt = bluetoothDevice.connectGatt(this, false, gattCallback);

  4. Обработка обратного вызова и запуск обнаружения службы

После подключения устройства я звоню, чтобы узнать об услугах.

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() разрешить эту проблему

Другие вопросы по тегам