2016-04-15 18 views
6

Próbuję odczytywać charakterystykę z urządzenia BLE w sposób ciągły.Android Bluetooth LE - Czytaj Cechy nie działa na Samsunga

Stworzyłem Runnable w moim klasy usługi:

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; 
     } 
    } 

I na udane odkrycia usług Wołam:

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

    } 

i to jest mój na characterics czytać oddzwaniania -

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); 
      } 

     } 

Aplikacja działa poprawnie na Nexusie 5, Nexusie 4 i Motorola G.

Po uruchomieniu tego kodu na Samsung S6 nie działa, onCharacteristicRead() nie jest wywoływany.

Przeczytałem, że wykonywanie połączeń sekwencyjnych na readCharacteristics() może powodować problemy, ponieważ czeka na wykonanie onCharacteristicRead.

+0

Co to jest wersja OS? –

+0

Wersja Os - Android 5.1.1. – Anukool

+0

Proszę sformatować swój kod. –

Odpowiedz

0

Zaleca się uruchamianie tylko jednego polecenia Gatt na raz, ponieważ commands are not stacked. Musiałbyś więc zaimplementować jakiś mechanizm, który zostanie wywołany następnym czytaniem po otrzymaniu oddzwaniania do bieżącego.

Należy pamiętać, że wywołania zwrotne Gatt mogą pochodzić z różnych wątków, ale nie powinno to stanowić problemu, jeśli zapiszesz wartość odczytu w wywołaniu zwrotnym, a następnie uruchomisz następny odczyt.

+0

Próbowałem uruchamiać odczyt charakterystyk tylko po wywołaniu wywołania zwrotnego onCharacteristicRead. Nie działa jednak, czy myślisz, że gdzieś robię coś nie tak? – Anukool

+0

cóż, dlaczego wywołanie 'onCharacteristicRead' powinno zostać wywołane, jeśli najpierw nie wykonasz polecenia read? – JPS

+0

Najpierw wykonuję charakterystykę odczytu zaraz po wykryciu usług, a następnie po raz pierwszy wywoływana jest oncharakterystykaRead. A po tym wywołam charakterystykę odczytu w onCharacteristicsRead, która nie działa. – Anukool