Android蓝牙LE - 读取特性不适用于三星

时间:2016-04-15 22:44:11

标签: android bluetooth-lowenergy

我正在尝试不断地从BLE设备中读取特征。

我在服务类中创建了一个Runnable:

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

成功发现我呼吁的服务:

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

    }

这是我的特色阅读回调 -

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

        }

该应用程序在Nexus 5,Nexus 4和Motorola G上运行良好。

当我在Samsung S6上运行此代码时,它无效,onCharacteristicRead()未被调用。

我读到,在等待onCharacteristicRead执行时,对readCharacteristics()进行顺序调用会导致问题。

1 个答案:

答案 0 :(得分:0)

建议一次只执行一个gatt命令,因为commands are not stacked。因此,您必须实现某种机制,在您获得当前读取的回调后调用下一个读取。

请记住,gatt回调可以来自不同的线程,但是如果你在回调中保存读取值然后从那里触发下一次读取,这应该没问题。