我刚开始使用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中的源代码不匹配。
我该如何解决这个问题?
答案 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());
}