GATT-Rückruf kann nicht registriert werden

Ich versuche, eine Anwendung zum Senden von Nachrichten über Bluetooth Low Energy zu schreiben, die dann von UART in meinem Peripheriegerät weitergeleitet wird. Ich bin den Schritten gefolgtHier und die App sucht und findet das Gerät erfolgreich. Die Verbindung mit der Methode BluetoothGatt = BluetoothDevice.connectGatt (Kontext, Autoconnect, Rückruf) schlägt jedoch fehl, und logcat meldet "Rückruf konnte nicht registriert werden".

Anruf von:

//device scan callback
private BluetoothAdapter.LeScanCallback btScanCallback = new BluetoothAdapter.LeScanCallback() 
{
    @Override
    public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord)
    {       
        some stuff
        currBtGatt = device.connectGatt(parentActivity, false, btGattCallback);
    }
};

Und der Gatt-Rückruf:

//GATT callback
private BluetoothGattCallback btGattCallback = new BluetoothGattCallback()
{       
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState)
    {
        // if connected successfully
        if(newState == BluetoothProfile.STATE_CONNECTED)
        {
            //discover services
            updateStatus("Connected");
            gatt.discoverServices();
        }
        else if(newState == BluetoothProfile.STATE_DISCONNECTED)
        {
            updateStatus("Disconnected");
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status)
    {
        if(status == BluetoothGatt.GATT_SUCCESS)
        {
            //pick out the (app side) transmit channel
            currBtService = gatt.getService(uartUuids[0]);
            currBtCharacteristic = currBtService.getCharacteristic(uartUuids[1]);
        }
        else 
        {
            updateStatus("Service discovery failed");
        }
    }
};

Logcat sagt:

11-19 10:40:39.363: D/BluetoothAdapter(11717): stopLeScan()
11-19 10:40:39.373: D/BluetoothGatt(11717): connect() - device: DC:6D:75:0C:0F:F9, auto: false
11-19 10:40:39.373: D/BluetoothGatt(11717): registerApp()
11-19 10:40:39.373: D/BluetoothGatt(11717): registerApp() - UUID=3ba20989-5026-4715-add3-a5e31684009a
11-19 10:40:39.373: I/BluetoothGatt(11717): Client registered, waiting for callback
11-19 10:40:49.373: E/BluetoothGatt(11717): Failed to register callback
11-19 10:40:49.533: D/BluetoothGatt(11717): onClientRegistered() - status=0 clientIf=5
11-19 10:40:49.533: E/BluetoothGatt(11717): Bad connection state: 0
11-19 10:40:49.593: D/BluetoothGatt(11717): onClientConnectionState() - status=0 clientIf=5 device=DC:6D:75:0C:0F:F9
11-19 10:40:49.593: W/BluetoothGatt(11717): Unhandled exception: java.lang.NullPointerException

Interessanterweise wechselt mein Peripheriegerät in einen "verbundenen" Zustand (ich habe Anzeige-LEDs) und ich kann über dasselbe Telefon mit einer Demo-Anwendung oder mit einem PC-BLE-Dongle eine Verbindung dazu herstellen. Irgendwelche Ideen geschätzt.

[EDIT] die connectGatt-Methode gibt null zurück, was ich denke, erwartet wird.

[EDIT] Bei der Überprüfung des API 18-Quellcodes wird die Meldung "Callback konnte nicht registriert werden" angezeigt, da die Methode registerApp () false zurückgibt, da die Methode registerClient () des IBluetoothGatt "mService" wahrscheinlich eine Remote-Ausnahme auslöst an der linie:

enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");

weil die Protokollmeldung in der nächsten Zeile nie angezeigt wird. Es könnte sich also um eine Berechtigungssache handeln, mit der Ausnahme, dass die Anwendunghat Bluetooth- und Bluetooth_Admin-Berechtigungen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage