2015-07-22 2 views
0

Я отсоединение и закрывающой BLUETOOTH системы ГАТТ экземпляр и увидеть следующий LogCat:NullPointerException в BluetoothGatt.java на Nexus 4

07-22 09:33:20.699 5095-5113/com.assaabloy.stg.cliqconnect.android W/BluetoothGatt﹕ Unhandled exception in callback 
java.lang.NullPointerException 
     at android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:168) 
     at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:71) 
     at android.os.Binder.execTransact(Binder.java:404) 
     at dalvik.system.NativeStart.run(Native Method) 

Вот родные события, которые непосредственно предшествуют эту ошибку:

07-22 09:33:20.689 1260-1277/? D/BtGatt.GattService﹕ clientDisconnect() - address=84:EB:18:44:D2:04, connId=9 
07-22 09:33:20.689 1260-1277/? D/BtGatt.btif﹕ btif_gattc_close 
07-22 09:33:20.689 1260-1322/? D/BtGatt.btif﹕ btgattc_handle_event: Event 1005 
07-22 09:33:20.689 1260-1568/? E/bt-btif﹕ Do not find the bg connection mask for the remote device 
07-22 09:33:20.689 1260-1322/? D/BtGatt.btif﹕ btif_gattc_upstreams_evt: Event 5 
07-22 09:33:20.689 1260-1322/? D/BtGatt.GattService﹕ onDisconnected() - clientIf=9, connId=9, address=84:EB:18:44:D2:04 
07-22 09:33:20.689 1260-1328/? D/BtGatt.GattService﹕ unregisterClient() - clientIf=9 
07-22 09:33:20.689 1260-1328/? D/BtGatt.btif﹕ btif_gattc_unregister_app 
версия

ОС: Android 4.4.4

Прибор: Nex us 4

Может кто-нибудь объяснить, что происходит?

+0

Нет кода? Как мы можем помочь? –

+0

Поскольку авария происходит в естественном стеке BLE, я не был уверен, что мой код имеет значение для выяснения причины (этот сценарий отлично работает на других устройствах). Но в основном у меня есть экземпляр BluetoothGatt и вызывается 'disconnect()', а затем сразу после 'close()' – Alix

+0

Теперь это странно. 'close()' вызывает 'unregisterApp()', который устанавливает обратный вызов на 'null'. Кажется, что разрыв отключен или слишком медленный или не проходит так, что вызывающий вызов 'onConnectionStateChange' вызывается после того, как приложение незарегистрировано (таким образом, обратный вызов уже установлен на« null »). Odd. Очень любопытно для исходного кода. –

ответ

1

Кажется, вы не можете назвать этот метод вместе. Обратный вызов отключения может прибыть позже, чем close().

Вы можете добавить mGatt.close(); в контактный телефон onConnectionStateChange, чтобы закрыть соединение.

check this link

+0

. Ваше предложение - это то, что в настоящее время реализовано, и я больше не видел эту проблему , Может быть, тогда это решает ... Я дам вам правильный ответ тем временем – Alix

0

В этом положении BluetoothGatt пытается позвонить onConnectionStateChange(...) на ваш BluetoothGattCallback экземпляр.

Вы переопределили это?

private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() { 
     @Override 
     public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     ... 
     } 
} 
+0

Да, я могу подтвердить, что этот обратный вызов был переопределен – Alix

+0

Добавьте в него некоторый отладочный вывод. Вызывается ли он на Connect/Disconnect? Можете ли вы предоставить код, связанный с Bluetooth? –

+0

Я могу вернуться к вам, но я уверен, что он вызван на соединение. – Alix

-1

Одно из решений просто вызвать отключение() на объекте BluetoothGatt. Вызов функции close() в обратном вызове OnConnectionStateChange().

0

я получил подобное исключение на Samsung SM G318H "Trend 2 Lite":

D/BluetoothGatt(4182): onClientConnectionState() - status=0 clientIf=6 device=D0:5F:B8:57:FE:33 
W/BluetoothGatt(4182): Unhandled exception in callback 
W/BluetoothGatt(4182): java.lang.NullPointerException 
W/BluetoothGatt(4182): at android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:172) 
W/BluetoothGatt(4182): at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:71) 
W/BluetoothGatt(4182): at android.os.Binder.execTransact(Binder.java:404) 
W/BluetoothGatt(4182): at dalvik.system.NativeStart.run(Native Method) 

при попытке восстановить внутри обработчика изменения состояния:

public final void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 

    switch (newState) { 
    case BluetoothProfile.STATE_DISCONNECTED: 
     device.connectGatt(...); 
     break; 
    } 

} 

и решить ее путем перемещения повторное подключение к резьбе таймера:

case BluetoothProfile.STATE_DISCONNECTED: 
     timer.schedule(
     new TimerTask() { 
      @Override 
      public void run() { 
      device.connectGatt(...); 
      } 
     }, 3000); 
     break;