Я пытаюсь написать приложение для отправки сообщений по Bluetooth Low Energy, которое затем будет передано UART в моем периферийном устройстве. Я выполнил шаги here, и приложение сканирует и находит устройство успешно. Однако соединение с использованием метода BluetoothGatt = BluetoothDevice.connectGatt (контекст, автосоединение, обратный вызов) завершается с ошибкой, при этом логарифм говорит «Не удалось зарегистрировать обратный вызов».Обратный вызов GATT не регистрируется
Вызов сделан из:
//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 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
Интересно, что мои периферические движется к "связ" состоянии (I имеют светодиоды индикации), и я могу подключиться к нему с одного телефона с демонстрационным приложением или с ПК BLE do ngle. Любые идеи оценили.
[EDIT] метод connectGatt возвращает значение null, которое, как я предполагаю, ожидается.
[EDIT] При проверке исходного кода API 18 появляется сообщение «Не удалось зарегистрировать обратный вызов», поскольку метод registerApp() возвращает false, потому что метод registerClient() IBluetoothGatt «mService» выбрасывает удаленное исключение, вероятно, на линии:
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
потому что сообщение журнала в самой следующей строке никогда не видно. Таким образом, это может быть проблема разрешений, за исключением того, что приложение имеет разрешения bluetooth и bluetooth_admin.
Большое вам спасибо! Я просто не мог понять, почему мое приложение регистрируется без каких-либо исключений, когда я вызываю connectGatt, но почему не был вызван GattCallback. Вызов connectGatt на основной поток исправил это! –
@ Linard Рад помочь. Я думаю, что это ошибка, и ее нужно решить. До тех пор, спасибо, Stack Overflow –
Это такие неприятные ошибки ... Google может просто упомянуть что-то вроде «нужно вызывать из основного потока» в документах –