Unhandled exception in callback while trying to connect with BluetoothGatt
<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>