Intereting Posts
Android – EditText предоставляет исключение IndexOutOfBounds при использовании textAllCaps Com.google.android.gms.internal.zzhu: не удается найти ссылочный класс android.security.NetworkSecurityPolicy Приложение не запускается в визуальном студийном эмуляторе для Android в visual studio 2015 Какова цель «полезной нагрузки разработчика»? Для чего он может быть использован? Такое же меню вариантов во всех мероприятиях на Android Производительность Android xml vs java Как запустить программы Frege на Android? Как обычные разработчики пытаются установить isPermissionRevokedByPolicy ()? Отключить прокрутку для позиции в RecyclerView с помощью ItemTouchHelper.SimpleCallback Как я могу проверить / обновить версию Proguard, используя ее в разработке Eclipse для Android? Метод NetworkImageView от Volley – setImageBitmap не работает Android: как получить последние 50 местоположений ячейки (башни)? Горизонтальный ListView в Android? Конфигурация устройства Android для AOSP Определить и связать событие click или touch

Android BluetoothGatt – статус 133 – регистрация обратного вызова

Прежде всего, я прочитал SOLVED: Обратный вызов GATT не смог зарегистрироваться и предпринял шаги, предложенные в этом сообщении, для решения этой проблемы без успеха. Рекомендуемое исправление там, если вы еще не прочитали, это сделать все вызовы BLE из основного потока напрямую или с помощью обработчика.

Я работаю над приложением BLE, которое хочет запустить службу (вызывается из активности каждые 10 секунд), которая выполняет следующие задачи:

1)Gets list of our products available to connect to (done, works) 2)For each available device: 2a)connect to device 2b)discover services 2c)read 5 characteristics in this fashion: 2c1)read characteristic 2c2)onCharacteristicRead parse data 2c3)when finished with data read next characteristic 2c4)repeat until all are read (this is done using a state var and switch statement) 2d)disconnect from device 2e)connect to next device 2f)repeat until all devices are read from 2g)stopSelf() 

Итак, проблема … Все отлично работает. Я могу выполнить весь запуск службы {startService (…); В mainActivity}, чтобы закончить {stopSelf (); В службе} 6 раз.

В 7-й раз я получил BluetoothGatt. Не удалось зарегистрировать обратный вызов. Я не уверен, почему я могу запустить его 6 раз успешно, а затем провалиться в 7-й раз.

Имейте в виду, что я делаю все вызовы BLE из основного потока, и это было подтверждено в журнале cat из нескольких мест.

Вот схема моего кода:

SERVICE.JAVA

 private Handler handler = new Handler(); private BluetoothGatt cGatt = null; private int unitIndex = 0; // keep track of currently connected unit private int state = 0; //used to keep track of which characteristic to read next public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "Service Started..."); //get ArrayList of units if(units.size > 0) handler.post(connectNextRunnable); //calls connectNextDevice() else stopSelf(); } private Runnable discoverServices = new Runnable() { public void run() { cGatt.discoverServices(); } } private Runnable readNextValue = new Runnable() { public void run() { BluetoothGattCharacteristic c = null; switch(state) { //set c to appropriate characteristic default: // all characteristics read unitIndex++; handler.post(connectNextRunnable) return } cGatt.readCharacteristic(c); } } private void connectNextDevice() { if(unitIndex == 0) store System.nanoTime in variable if(unitIndex >= units.size) //finished will all units stopSelf(); if(unitIndex < units.size) cGatt.disconnect //if null cGatt.connectGatt(this, false, gattCallback) } private BluetoothGattCallback gattCallback = new BluetoothGattCallback() { public void onConnectionStateChange() { handler.post(discoverServices); } public void onServicesDeiscovered() { handler.post(readNextValue); } public void onCharacteristicRead() { ParseData(); } private void ParseData() { //do stuff with data handler.post(readNextValue); } } 

Итак, как я уже сказал, все элементы BLE вызываются из основного потока через обработчик. Служба успешно работает 6 раз от начала до конца. В 7-й раз я получаю, что этот немой не смог зарегистрировать обратный вызов.

Я могу предоставить более подробную информацию о logcat, если вы считаете это актуальным. Я не был в исходном сообщении, потому что я выводил на него много информации, чтобы проверить полученные данные и т. Д.

Ниже приведена информация о logcat для 7-го запуска моего сервиса от начала до конца.

 08-15 12:00:10.746: I/PMIQ BTS(32027): Service Started... 08-15 12:00:10.746: I/PMIQ BTS(32027): Units: 1 08-15 12:00:10.746: D/AbsListView(32027): unregisterIRListener() is called 08-15 12:00:10.766: I/PMIQ BTS(32027): Connecting to next device... 08-15 12:00:10.766: I/PMIQ BTS(32027): Unit index = 0 08-15 12:00:10.766: I/PMIQ BTS(32027): Connecting to pmIQ-IQ130_D93A 08-15 12:00:10.766: I/System.out(32027): main 08-15 12:00:10.766: D/BluetoothGatt(32027): connect() - device: 00:1E:C0:19:D9:3A, auto: false 08-15 12:00:10.766: D/BluetoothGatt(32027): registerApp() 08-15 12:00:10.766: D/BluetoothGatt(32027): registerApp() - UUID=e9d10870-4b09-451c-a9fa-c6b5f3594a77 08-15 12:00:10.766: I/BluetoothGatt(32027): Client registered, waiting for callback 08-15 12:00:10.766: D/BluetoothGatt(32027): onClientRegistered() - status=133 clientIf=0 08-15 12:00:10.766: I/PMIQ BTS(32027): CONECTION STATE CHANGED...Binder_2 **08-15 12:00:10.766: E/BluetoothGatt(32027): Failed to register callback** 08-15 12:00:10.766: I/PMIQ BTS(32027): Could not connect to null ... 257 08-15 12:00:10.766: I/PMIQ BTS(32027): Connecting to next device... 08-15 12:00:10.766: I/PMIQ BTS(32027): Unit index = 1 08-15 12:00:10.766: I/PMIQ BTS(32027): ****************************** 08-15 12:00:10.766: I/PMIQ BTS(32027): Start Time: 4360642409647 08-15 12:00:10.766: I/PMIQ BTS(32027): End Time: 4360648970925 08-15 12:00:10.766: I/PMIQ BTS(32027): Difference: 6561278 08-15 12:00:10.766: I/PMIQ BTS(32027): Time to complete: 6 08-15 12:00:10.766: I/PMIQ BTS(32027): ****************************** 08-15 12:00:10.876: I/PMIQ BTS(32027): ...Service Destroyed 

Если вы сделали это здесь, спасибо! Я не мог найти ЛЮБОЙ информации о том, что означает = 133 означает ?! Это происходит только тогда, когда обратный вызов завершается с ошибкой. Каждый раз это статус = 0.

 08-15 12:00:10.766: D/BluetoothGatt(32027): onClientRegistered() - status=133 clientIf=0 

Если бы кто-нибудь мог ответить на это, это могло бы мне очень помочь. Или, если кто-нибудь скажет мне, почему он работает только 6 раз. Может быть полезно любое понимание или догадка!

Всем спасибо!

Solutions Collecting From Web of "Android BluetoothGatt – статус 133 – регистрация обратного вызова"

Хорошо, я понял это. Проблема заключалась главным образом в том, что я просматривал документацию BluetoothGatt . Я звонил .disconnect() , но не .close() . Поскольку Galaxy s4 может обрабатывать только 6 подключений одновременно, моя служба работает только 6 раз. Добавление .close() в мой код позволило ему правильно отключить соединение и освободить эти используемые соединения.

Источник, из-за которого я перечитал документы более внимательно!

Поэтому не забудьте использовать .close () на вашем объекте BluetoothGatt, если у вас есть повторяющееся соединение с одним и тем же устройством!