4

我刚开始使用 Android,并使用蓝牙 LE 在 Android Studio 中设置了一个 API 21 项目。

深入 BluetoothDevice 向我展示了 ConnectGatt() 方法的两个签名:

public BluetoothGatt connectGatt(Context context, boolean autoConnect,
                                 BluetoothGattCallback callback)

public BluetoothGatt connectGatt(Context context, boolean autoConnect,
                                 BluetoothGattCallback callback, int transport)

我想使用第二个,但构建失败:

错误:(127, 26) 错误:BluetoothDevice 类中的方法 connectGatt 不能应用于给定类型;必需:上下文、布尔值、BluetoothGattCallback 找到:上下文、布尔值、BluetoothGattCallback、int 原因:实际参数列表和正式参数列表的长度不同

编译器设置似乎与 Android Studio 中的源代码不匹配。

我怎样才能解决这个问题?

4

3 回答 3

6

如果你想使用隐藏的 API,你可以调用你想使用的方法。但是您必须记住,隐藏的 API 可以随时更改。您必须自担风险使用它。

这是一个示例代码如何使用隐藏的 connectGatt() 方法。

        Method connectGattMethod;
        BluetoothGatt connectGatt;

        try {
            connectGattMethod = device.getClass().getMethod("connectGatt", Context.class, boolean.class, BluetoothGattCallback.class, int.class);
        } catch (NoSuchMethodException e) {
          //NoSuchMethod
        }

        try {
            connectGatt = (BluetoothGatt) connectGattMethod.invoke(device, this, false, mBluetoothGattCallback, 2); // (2 == LE, 1 == BR/EDR)
        } catch (IllegalAccessException e) {
            //IllegalAccessException
        } catch (IllegalArgumentException e) {
            //IllegalArgumentException
        } catch (InvocationTargetException e) {
            //InvocationTargetException
        }
于 2015-01-15T10:37:12.163 回答
3

更新!!!我可能已经找到了解决这个困扰我们的缺陷的方法。由于 android 默认连接在 L2CAP Channel 5 上,iOS 拒绝这样做。这是由于 iOS 广告数据包上的位标志指示 BR/EDR。

查看 android 代码,我发现 connectGatt() 函数有一个隐藏的 int TRANSPORT 变量,它只允许您使用 AUTO 或特定的 LE 或 BR/EDR。

出于某种原因,这在 android studio 的 BluetoothDevice.java 文件中可用,但未在 android 代码参考中列出。当您尝试使用它时,它会给您一个错误。如果有人可以解释我们如何修复 android studio 上的编译器以使用 TRANSPORT_LE 选项而不是我假设正在使用的 TANSPORT_AUTO 编译我们的代码。

好的,这又回来了,让我们开始工作吧!

于 2015-01-01T18:47:21.980 回答
0

我希望这个对你有用:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        device.connectGatt(context, true, getBluetoothGattCallback(), BluetoothDevice.TRANSPORT_LE);
    } else {
        device.connectGatt(context, true, getBluetoothGattCallback());
    }
于 2019-06-23T12:42:22.683 回答