Android 蓝牙 LE 错误 : Failed to register callback

标签 android mobile bluetooth bluetooth-lowenergy gatt

我正在编写一个 Android 应用程序,它将通过蓝牙 LE 连接到健康设备。但是,好像我没有正确连接到它的 GATT 服务器。每隔几秒钟,我的日志文件就会显示:

03-27 11:33:39.821: D/BluetoothAdapter(26644): onScanResult() - Device=0C:F3:EE:AA:33:35 RSSI=-53
03-27 11:33:39.821: I/BluetoothGattActivity(26644): New LE Device: BT-001 @ -53
03-27 11:33:39.821: I/BluetoothGattActivity(26644): New LE Device matches !!!
03-27 11:33:39.831: I/BluetoothGattActivity(26644): In the fish function.
03-27 11:33:39.831: D/BluetoothGatt(26644): connect() - device: 0C:F3:EE:AA:33:35, auto:  false
03-27 11:33:39.831: D/BluetoothGatt(26644): registerApp()
03-27 11:33:39.831: D/BluetoothGatt(26644): registerApp() - UUID=7155a6e0-5432-42cc-8b05-a080c86aaccb
03-27 11:33:39.841: I/BluetoothGatt(26644): Client registered, waiting for callback
03-27 11:33:49.840: E/BluetoothGatt(26644): Failed to register callback
03-27 11:33:49.840: I/BluetoothGattActivity(26644): myBluetoothGatt is null

如果有人可以帮助我了解我的问题出在哪里以及发生了什么,将不胜感激。我正在使用 Galaxy s4。我相信我所有的相关代码都在下面:

private void broadcastUpdate(final String action) {
   final Intent intent = new Intent(action);
   sendBroadcast(intent);
}

private void fish(final BluetoothDevice device) {      
   Log.i(TAG, "In the fish function.");
   myBluetoothGatt = device.connectGatt(this, false, myGattCallback);
   Log.i(TAG, "myBluetoothGatt is " + myBluetoothGatt);
}

private BluetoothAdapter.LeScanCallback callbackFunction = new BluetoothAdapter.LeScanCallback() {
   @Override
   public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
       Log.i(TAG, "New LE Device: " + device.getName() + " @ " + rssi);
       if (DEVICE_NAME.equals(device.getName())) {
           Log.i(TAG, "New LE Device matches !!!");
           fish (device);
           }
   }
};

private final BluetoothGattCallback myGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        String intentAction;
        Log.i(TAG, "We are in the ConnectionStateChanged().");
        if (newState == BluetoothProfile.STATE_CONNECTED) {
            intentAction = ACTION_GATT_CONNECTED;
            mConnectionState = STATE_CONNECTED;
            broadcastUpdate(intentAction);
            Log.i(TAG, "Connected to GATT server.");
            Log.i(TAG, "Attempting to start service discovery:" +
                    myBluetoothGatt.discoverServices());

        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
            intentAction = ACTION_GATT_DISCONNECTED;
            mConnectionState = STATE_DISCONNECTED;
            Log.i(TAG, "Disconnected from GATT server.");
            broadcastUpdate(intentAction);
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        Log.i(TAG, "In area 1");
        if (status == BluetoothGatt.GATT_SUCCESS) {
            broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
            System.out.println("--onServicesDiscovered");
        } else {
            Log.w(TAG, "onServicesDiscovered received: " + status);
        }
    }

    @Override
    public void onCharacteristicRead(BluetoothGatt gatt,BluetoothGattCharacteristic characteristic,int status) {
        Log.i(TAG, "In area 2");
        if (status == BluetoothGatt.GATT_SUCCESS) {
            broadcastUpdate(ACTION_DATA_AVAILABLE);
            Log.i(TAG, "--onCharacteristicRead GATT_SUCCESS");
        }
    }

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt,
                                        BluetoothGattCharacteristic characteristic) {
        Log.i(TAG, "In area 3");
        broadcastUpdate(ACTION_DATA_AVAILABLE);
        System.out.println("--onCharacteristicChanged");
    }
};

最佳答案

对 device.connectGatt(this, false, myGattCallback) 的调用应该在主 UIThread 上完成。 所以它应该是这样的:

private void fish(final BluetoothDevice device) {
        Log.i(TAG, "In the fish function.");
        runOnUiThread(new Runnable() {
          @Override
          public void run() {
              myBluetoothGatt = device.connectGatt(this, false, myGattCallback);
          }
        });
}

关于Android 蓝牙 LE 错误 : Failed to register callback,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22694049/

相关文章:

java - ArrayList 的问题

iphone - 用 iPhone 控制蓝牙音频设备

java - Android/Java 上BluetoothSocket 的timeout 参数是什么单位?

android - 如何在android代码和 native 代码之间创建回调?

android - 以编程方式设置谷歌地图 fragment 可见性(API2)

javascript - JavaScript 中的 try-catch : how to get stack trace or line number of the original error

ios - Flutter:扩展图 block 在纵向模式下工作正常,在横向模式下失败

actionscript-3 - 我可以将 FlexMobile 项目设为纯 as3 吗?

蓝牙 UUID 发现

java - 无法将 fragment 类添加到我的 Android 项目