带有传输参数的BluetoothDevice.ConnectGatt()

时间:2014-12-24 08:12:22

标签: android bluetooth bluetooth-lowenergy gatt

我刚开始使用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发现:   Context,boolean,BluetoothGattCallback,int reason:actual and formal   参数列表的长度不同

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

我该如何解决这个问题?

3 个答案:

答案 0 :(得分: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
        }

答案 1 :(得分:3)

UPDATE !!! 我可能已经找到了解决这个问题的方法,这个问题困扰着我们。由于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来编译我们的代码,我认为正在使用它。

好的,这是重新开始的,让我们开始工作!

答案 2 :(得分:0)

我希望它对您有用:

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