title: Unhandled exception in callback while trying to connect with BluetoothGatt
body: <p>I am trying to connect to a peripheral. When I find the device I want in Scancallback I send a message with the device to my handler.</p>
  
  <pre><code>11-16 10:31:12.471 25907-25907/I/BleManager: START SCAN
  11-16 10:31:12.471 25907-25907/ D/BluetoothAdapter: startLeScan(): null 
  11-16 10:31:12.481 25907-25918/ D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 
  11-16 10:31:12.731 25907-25918/ W/BleOlderScanCallback: Try to connect device 
  11-16 10:31:12.731 25907-25907/ I/BleManager: STOP SCAN 
  11-16 10:31:12.731 25907-25907/ D/BluetoothAdapter: stopLeScan() 
  11-16 10:31:12.741 25907-25907/ I/BleManager: connect device 
  11-16 10:31:12.741 25907-25907/ I/Runnable: connectGatt 
  11-16 10:31:12.741 25907-25907/ D/BluetoothGatt: connect() - device: [hidden], auto: false 
  11-16 10:31:12.741 25907-25907/ D/BluetoothGatt: registerApp() 
  11-16 10:31:12.741 25907-25907/ D/BluetoothGatt: registerApp() - UUID=[hidden] 
  11-16 10:31:12.751 25907-25919/ D/BluetoothGatt: onClientRegistered() - status=0 clientIf=5 
  11-16 10:31:15.441 25907-25918/ D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=5 device=[hidden] 
  11-16 10:31:15.441 25907-25918/ 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)
  </code></pre>
  
  <p>Here is my code:</p>
  
  <pre><code>@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
  
  public class BleOlderScanCallback implements BluetoothAdapter.LeScanCallback {
  
      private static final String TAG = BleOlderScanCallback.class.getSimpleName();
  
      private static final int START_BYTE_I = 2;
      private static final int MAC_BYTE_I = 7;
      private static final int MAC_SIZE = 6;
  
      private Handler handler;
      private String mac;
  
      public BleOlderScanCallback(Handler handler, String mac) {
          this.handler = handler;
          this.mac = mac;
      }
      protected void onResult(BluetoothDevice device, byte[] scanRecord){
          byte[] macBytes;
          String mac;
  
          if (device != null &amp;&amp; scanRecord != null) {
              macBytes = new byte[MAC_SIZE];
              System.arraycopy(scanRecord, MAC_BYTE_I, macBytes, 0, MAC_SIZE); // copy MAC_SIZE positions (since index MAC_BYTE_I) of array scanRecord to array mac
              mac = formatMAC(macBytes);
  
              Logg.i(TAG, mac + " device: " + device.getName());
              if (this.mac.equals(mac)) {
                  Logg.w(TAG, "Try to connect device");
                  handler.obtainMessage(BleHandler.SCANNED_DEVICE, device).sendToTarget();
              }
              else{
                  Logg.i(TAG, "Other mac ");
              }
          }
      }
  
      /**
       * API lower Lollipop (21)
       * @param device
       * @param rssi
       * @param scanRecord
       */
      @Override
      public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)   {
          onResult(device, scanRecord);
      }
  }
  </code></pre>
  
  <p>Here is my handler. It calls my manager class to connect BluetoothGatt</p>
  
  <pre><code>public class BleHandler extends Handler {
      private static final String TAG = BleHandler.class.getSimpleName();
  
      public static final int SCANNED_DEVICE = 1;
  
      private BleManager bleManager; // should I use WeakReference?
  
      public BleHandler (BleManager bleManager){
          this.bleManager = bleManager;
      }
  
      @Override
      public void handleMessage(Message message){
          BluetoothDevice device;
          switch (message.what){
              case SCANNED_DEVICE:
                  bleManager.stopBtScan();
                  device = (BluetoothDevice) message.obj;
                  bleManager.connect(device);
                  break;
          }
      }
  }
  </code></pre>
  
  <p>And in my manager class, connect method looks like this: </p>
  
  <pre><code>    public void connect(final BluetoothDevice device){
      Logg.i(TAG, "connect device");
      if (device == null){
          Logg.i(TAG, "device to connect is null");
          return;
      }
      Handler handler = new Handler(context.getMainLooper());
      handler.post(new Runnable() {
          @Override
          public void run() {
              Logg.i("Runnable", "connectGatt");
              bluetoothGatt = device.connectGatt(context, false, bluetoothGattCallback);
          }
      });
  }
  </code></pre>
  
  <p>I override BluetoothGatt.onConnectionStateChange, but execution dont arrive here</p>
  
  <pre><code>@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
  public class BleGattCallback extends BluetoothGattCallback {
      private static final String TAG = BleGattCallback.class.getSimpleName();
  
  
      private int connectionState = STATE_DISCONNECTED;
  
      protected static final int STATE_DISCONNECTED = 0;
      protected static final int STATE_CONNECTING = 1;
      protected static final int STATE_CONNECTED = 2;
  
  //    public static final String ACTION_GATT_CONNECTED = "com.example.bluetooth.le.ACTION_GATT_CONNECTED";
      @Override
      public void onConnectionStateChange(BluetoothGatt gatt, int status,
                                          int newState) {
          Logg.i(TAG, "onConnectionStateChange");
          try {
              super.onConnectionStateChange(gatt, status, newState);
  
              if (newState == BluetoothProfile.STATE_CONNECTED) {
                  connectionState = STATE_CONNECTED;
                  Logg.w(TAG, "Connected to GATT server");
                  Logg.i(TAG, "Attempting to start service discovery:" + gatt.discoverServices());
              } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                  connectionState = STATE_DISCONNECTED;
                  Logg.w(TAG, "Disconnected from GATT server.");
                  try {
                      gatt.close();
                  } catch (Exception e) {
                      Logg.d(TAG, "close ignoring: " + e);
                  }
              }
          }catch(NullPointerException e){
              Logg.i(TAG, "NullPointerException onConnectionStateChange");
          }
      }
  }
  </code></pre>
  
  <p>I saw here in stackoverflow a similar error when trying to disconnect and that the solution was to not call gatt.close() right after gatt.disconnect, but this is a diffent problem and I couldn't resolve it. I'm new programming with Bluetooth LE and am stuck in this part.</p>