android BLE writeCharacteristic在设备上运行时返回false,但在调试模式下工作。

时间:2017-09-20 14:38:26

标签: android android-studio bluetooth bluetooth-lowenergy android-bluetooth

尝试创建一个BLE中央应用程序以与外围设备通信。

我正在使用此处提供的BluetoothLeService应用https://developer.android.com/guide/topics/connectivity/bluetooth-le.html

要创建外围设备,我使用的是Android APP https://play.google.com/store/apps/details?id=com.macdom.ble.blescanner

我能够阅读并获得有关特性变化的通知,我修改了BluetoothLeService以使用BluetoothGatt的writeCharacteristic更新特征。

使用的设备:

外设:Redmi Note 4(启用所有权限(读,写,通知))

用作核心的设备:

  • LGE Nexus 5X(Android 7.1.2,API 25)

  • LGE Nexus 4(Android 5.1.1,API 22)

Android Studio: 版本2.3.3 gradle文件:  android {     compileSdkVersion 25     buildToolsVersion“25.0.3”

defaultConfig {
    minSdkVersion 18
    targetSdkVersion 25
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

sourceSets {
    main {
        dirs.each { dir ->
            java.srcDirs "src/${dir}/java"
            res.srcDirs "src/${dir}/res"
        }
    }
    androidTest.setRoot('tests')
    androidTest.java.srcDirs = ['tests/src']

}

}

代码:

@Override
public void onCharacteristicWrite(BluetoothGatt gatt,
                                      BluetoothGattCharacteristic characteristic, int status) {
        Log.w("Tharun", "onServicesDiscovered received: " + status);
        setStatus(status);
        broadcastUpdate(WRITE_DATA);
    }
};


 public void writeCharacteristic(BluetoothGattCharacteristic characteristic, String
        writeString) {
    if (mBluetoothAdapter == null || mBluetoothGatt == null) {
        Log.w(TAG, "BluetoothAdapter not initialized");
        return;
    }
    characteristic.setValue(writeString);

    boolean result = mBluetoothGatt.writeCharacteristic(characteristic);

    Log.w(TAG, "writeCharacteristic result : " + result);
}

问题:

当我在上述设备上执行代码时,writeCharacteristic返回false。即使是onCharacteristicWrite也不会被调用。

但是当我将android studio以调试模式附加到App并添加一个断点(只有在有一些断点时,如果没有断点它不起作用)写入成功发生并且onCharacteristicWrite正在运行

我无法弄清问题是什么。

我试图通过该函数的代码来查看为什么它返回false,但无法找到任何内容。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我确保没有GATT操作还没有完成。我最初的怀疑是android-studio运行源代码与我设备上的代码不同。因此,在调试模式下运行的代码与仅在设备上运行的代码不同。 事实证明这是真的。我创建了一个新项目(使用api 22和android 5.1.1)复制了所有代码。现在工作正常。