Ошибка Bluetooth Bluetooth Bluetooth: не удалось зарегистрировать обратный вызов

Я нахожусь в написании приложения для Android, которое будет подключаться к медицинскому устройству через Bluetooth LE. Однако кажется, что я не подключаюсь к его серверу GATT должным образом. Каждые несколько секунд мой файл журнала показывает это:

03-27 11:33:39.821: D/BluetoothAdapter(26644): onScanResult() - Device=0C:F3:EE:AA:33:35 RSSI=-53 03-27 11:33:39.821: I/BluetoothGattActivity(26644): New LE Device: BT-001 @ -53 03-27 11:33:39.821: I/BluetoothGattActivity(26644): New LE Device matches !!! 03-27 11:33:39.831: I/BluetoothGattActivity(26644): In the fish function. 03-27 11:33:39.831: D/BluetoothGatt(26644): connect() - device: 0C:F3:EE:AA:33:35, auto: false 03-27 11:33:39.831: D/BluetoothGatt(26644): registerApp() 03-27 11:33:39.831: D/BluetoothGatt(26644): registerApp() - UUID=7155a6e0-5432-42cc-8b05-a080c86aaccb 03-27 11:33:39.841: I/BluetoothGatt(26644): Client registered, waiting for callback 03-27 11:33:49.840: E/BluetoothGatt(26644): Failed to register callback 03-27 11:33:49.840: I/BluetoothGattActivity(26644): myBluetoothGatt is null 

Если кто-то может помочь мне понять, где моя проблема и что происходит, было бы весьма полезно. Я использую Galaxy s4. Я считаю, что весь мой соответствующий код ниже:

 private void broadcastUpdate(final String action) { final Intent intent = new Intent(action); sendBroadcast(intent); } private void fish(final BluetoothDevice device) { Log.i(TAG, "In the fish function."); myBluetoothGatt = device.connectGatt(this, false, myGattCallback); Log.i(TAG, "myBluetoothGatt is " + myBluetoothGatt); } private BluetoothAdapter.LeScanCallback callbackFunction = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { Log.i(TAG, "New LE Device: " + device.getName() + " @ " + rssi); if (DEVICE_NAME.equals(device.getName())) { Log.i(TAG, "New LE Device matches !!!"); fish (device); } } }; private final BluetoothGattCallback myGattCallback = new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { String intentAction; Log.i(TAG, "We are in the ConnectionStateChanged()."); if (newState == BluetoothProfile.STATE_CONNECTED) { intentAction = ACTION_GATT_CONNECTED; mConnectionState = STATE_CONNECTED; broadcastUpdate(intentAction); Log.i(TAG, "Connected to GATT server."); Log.i(TAG, "Attempting to start service discovery:" + myBluetoothGatt.discoverServices()); } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { intentAction = ACTION_GATT_DISCONNECTED; mConnectionState = STATE_DISCONNECTED; Log.i(TAG, "Disconnected from GATT server."); broadcastUpdate(intentAction); } } @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { Log.i(TAG, "In area 1"); if (status == BluetoothGatt.GATT_SUCCESS) { broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED); System.out.println("--onServicesDiscovered"); } else { Log.w(TAG, "onServicesDiscovered received: " + status); } } @Override public void onCharacteristicRead(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic,int status) { Log.i(TAG, "In area 2"); if (status == BluetoothGatt.GATT_SUCCESS) { broadcastUpdate(ACTION_DATA_AVAILABLE); Log.i(TAG, "--onCharacteristicRead GATT_SUCCESS"); } } @Override public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) { Log.i(TAG, "In area 3"); broadcastUpdate(ACTION_DATA_AVAILABLE); System.out.println("--onCharacteristicChanged"); } }; 

Вызов device.connectGatt (это, false, myGattCallback) должен выполняться на основном UIThread. Так должно быть что-то вроде этого:

 private void fish(final BluetoothDevice device) { Log.i(TAG, "In the fish function."); runOnUiThread(new Runnable() { @Override public void run() { myBluetoothGatt = device.connectGatt(this, false, myGattCallback); } }); } 

У меня есть частичное исправление для этой конкретной формы ошибки. Я видел в этом вопросе, что обратный вызов GATT не регистрирует, что устройствам Samsung требуется, чтобы попытки обнаружения Gatt выполнялись в потоке пользовательского интерфейса.

Трудная часть для меня заключалась в том, что я не был в той нищете, о которой я думал. Обратный вызов onLeScan не возвращался в поток пользовательского интерфейса, а вместо него – в потоке Binder (по крайней мере, в соответствии с отладчиком). Мне пришлось использовать Handler для отправки Runnable, который начал с моего кода обнаружения службы.

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

 04-04 14:21:15.115 9616-9616/BluetoothApp I/BluetoothGatt﹕ Client registered, waiting for callback 04-04 14:21:15.115 9616-9627/BluetoothApp D/BluetoothGatt﹕ onClientRegistered() - status=0 clientIf=5 

Я еще не понял, как решить этот последний вопрос, но это должно сделать вам еще один шаг.

Зарегистрируйте как callback, так и device.connectGatt (это, false, myGattCallback) внутри службы привязки, и для дальнейшей связи используйте широковещательный приемник.

После того, как вы получите событие или данные в обратном вызове, просто добавьте его и получите его от ресивера (который должен быть написан в приложении как отдельный или внутри основного действия, если вы используете только одно действие, а остальное – это фрагменты).

Intereting Posts
Получить текущую яркость экрана Как заставить собственный демон Unix / Linux работать на Android? Конвертировать миллисекунду в Joda Date Time или для зоны 0000 Текущие установки Google Play превышают активные установки Добавление параметра предпочтения в фрагментарный элемент FragmentPagerAdapter Android apk – Как исключить файл .so из сторонней зависимости с помощью gradle Android: имитирует длительное время работы Должен ли я изучать Java перед изучением Android Ошибка раздувания класса com.facebook.widget.LoginButton Twitter Bootstrap: навигационная панель не изменяется при изменении ориентации (только с браузером акций Android) Android – Snackbar vs Toast – использование и различие Как я могу разместить две кнопки рядом с изображением в нижней части кнопки? Стиль темы для Android не применяется Как показать информацию о установленном приложении на Android? Почему я получаю сообщения о java.lang.UnsatisfiedLinkError с рынка