发现BLE服务的正确方法

时间:2018-03-22 20:39:41

标签: android bluetooth-lowenergy android-bluetooth

我一直收到错误:

  

引起:java.lang.NullPointerException:尝试调用虚拟   方法' java.util.UUID   android.bluetooth.BluetoothGattService.getUuid()'在null对象上   参考

当试图获得'使用UUID的已知服务和特性。文档说我需要先发现服务,但我想我做错了吗?这是我的连接方法:

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public void Connect(View view){

    Device=Adapter.getRemoteDevice("3C:A3:08:94:C3:11");

    Gatt=Device.connectGatt(this,true,GattCallback);

    Gatt.discoverServices();

    Service=Gatt.getService(UUID.fromString("0000FFE0-0000-1000-8000-00805F9B34FB"));

    ErrorID.setText(Service.getUuid().toString());

    Characteristic=Service.getCharacteristic(UUID.fromString("0000FFE1-0000-1000-8000-00805F9B34FB"));

    threadStatus=true;

    //connected indicator

}

textView用于确认已找到该服务。我在discoverServices()之后尝试添加延迟,但这并没有奏效。之后使用onServicesDiscovered()也无效。我是Java和Android的新手,如果我的问题很愚蠢,对不起,谢谢!

2 个答案:

答案 0 :(得分:1)

您需要使用GattCallback来覆盖回调方法。你需要在下面定义你的GattCallback代码。当您收到回调时,请执行相应的操作。

private final BluetoothGattCallback GattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            String intentAction;
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                // This is where you call to discover services. 
                Gatt.discoverServices();

            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            }
        }

        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                // This is where you will call the method to get the service
                Service=Gatt.getService(UUID.fromString("0000FFE0-0000-1000-8000-00805F9B34FB"));
            } else {
            }
        }

    };

答案 1 :(得分:0)

致电后

Gatt=Device.connectGatt(this,true,GattCallback);

在执行任何其他操作之前,您必须等待GattCallback的{​​{3}}被调用(具有适当的状态)。

一旦发生这种情况,您需要在Gatt个实例上调用onConnectionStateChange method,然后再次等待GattCallback onServicesDiscovered方法调用Gatt.getService

此时,在调用null后,您可以致电0.97.2.并期望收到非'fp'结果。即使您知道设备上预期存在哪些服务,也是如此。