使用传输参数的BluetoothDevice.ConnectGatt()函数

4

我刚开始学习Android,并在Android Studio中设置了一个API 21项目来使用Bluetooth LE。

深入研究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方法不能应用于给定类型;需要:Context、boolean、BluetoothGattCallback,找到:Context、boolean、BluetoothGattCallback、int,原因:实际和形式参数列表长度不同

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

我该如何解决?

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
        }

3

更新!!! 我可能已经找到了一个解决我们困扰已久的缺陷的方法。由于Android默认连接L2CAP通道5,而iOS拒绝这样做。这是由于iOS广告包中的一个位标志指示BR/EDR。

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

出于某种原因,这在Android Studio的BluetoothDevice.java文件中可用,但未在Android代码参考中列出。当您尝试使用此选项时,会出现错误。如果有人能够解释如何修复Android Studio上的编译器,以便使用TRANSPORT_LE选项来编译我们的代码,而不是我认为正在使用的TANSPORT_AUTO,则最好不过了。

好的,我们可以开始工作了!


0

希望它对你有用:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        device.connectGatt(context, true, getBluetoothGattCallback(), BluetoothDevice.TRANSPORT_LE);
    } else {
        device.connectGatt(context, true, getBluetoothGattCallback());
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接