Я пытаюсь написать приложение для отправки сообщений по Bluetooth Low Energy, которое затем будет передано UART в моей периферии. Я выполнил шаги здесь, и приложение сканирует и находит устройство успешно. Однако соединение с использованием метода BluetoothGatt = BluetoothDevice.connectGatt(контекст, автосоединение, обратный вызов) завершается неудачно, с логарифмом, в котором говорится: "Не удалось зарегистрировать обратный вызов".
Вызов:
//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);
}
};
И обратный вызов Gatt:
//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 говорит:
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
Интересно, что мое периферийное устройство переходит в "подключенное" состояние (у меня есть светодиоды индикации), и я могу подключиться к нему с того же телефона с помощью демонстрационного приложения или с помощью ключа ПК BLE. Любые идеи оценили.
[EDIT] метод connectGatt возвращает значение null, которое, как мне кажется, ожидается.
[EDIT] При проверке исходного кода API 18 появляется сообщение "Не удалось зарегистрировать обратный вызов", потому что метод registerApp() возвращает false, потому что метод registerClient() IBluetoothGatt "mService" выдает удаленный исключение, вероятно, на строке:
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
потому что сообщение журнала в самой следующей строке никогда не видно. Таким образом, это может быть проблема разрешений, за исключением того, что приложение имеет разрешения Bluetooth и bluetooth_admin.