Monday, April 25, 2016

Android Bluetooth LE - Read Characteristics not working on Samsung

Leave a Comment

I am trying to read the characteristics from a BLE device continously .

I have created a Runnable in my service class:

private class BackgroundRunnableForRead implements Runnable     {           private volatile  boolean isRunning = true ;         @Override         public void run() {             try {             BluetoothLeService.this.backgroundRunID = Thread.currentThread().getId();             while( isRunning) {                      List<BluetoothGattService> gattServices = BluetoothLeService.this.getSupportedGattServices();                      if (gattServices != null && gattServices.size() > 0) {                         BluetoothGattCharacteristic characteristic = getCharacteristic(gattServices);                          if (characteristic != null && (characteristic.getProperties() & 2) > 0) {                             BluetoothLeService.this.readCharacteristic(characteristic);                         }                     }                 }             }             catch(Exception e)             {                 isRunning= false;                 e.printStackTrace();             }          }          public void kill()         {             this.isRunning = false;         }     } 

And on successful discovery of services i am calling:

public void startReadingCharacteristics()     {         System.out.println("BluetoothLeService.startReadingCharacteristics");         this.mBackgroundRunnable = new BackgroundRunnableForRead();         mReadThread =  new Thread(mBackgroundRunnable);         mReadThread.start();      } 

And this is my on characterics read callback -

public void  onCharacteristicRead(BluetoothGatt gatt,                                          BluetoothGattCharacteristic characteristic,                                          int status) {             System.out.println("BluetoothLeService.onCharacteristicRead" + status);             if (status == BluetoothGatt.GATT_SUCCESS) {                 broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);             }          } 

The application works fine on Nexus 5 , Nexus 4 and Motorola G .

When i am running this code on Samsung S6 it does not work, onCharacteristicRead() is not called .

I read that making sequential calls to readCharacteristics() can cause problems as it waits for onCharacteristicRead to execute.

1 Answers

Answers 1

It is recommended to execute only one gatt command at a time because commands are not stacked. So you'd have to implement some sort of mechanism that the next read is called after you've got the read callback for the current one.

Keep in mind that gatt callbacks can come from different threads, but this should be no problem if you save the read value in the callback and then trigger the next read from there.

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment