安卓 ICS 上的蓝牙连接是不可能的



我正在编写一个应用程序,它将字节码从平板电脑发送到μ控制器。联想A1(Androi 2.3)和三星Galaxy Tab 7 Plus N(Android 3.2)一切正常。现在我在使用新的三星Galaxy Tab 2(Android 4.0)时遇到了问题。

我能够与蓝牙天线配对(连接到μ控制器并通过串行协议进行通信)。当我启动应用程序时,再次要求我输入密码并进行配对。输入配对密码后,我的主布局可见,但未建立连接。

日食中的LogCat告诉我:

06-19 16:00:20.656: V/BluetoothSocket.cpp(3189): availableNative
06-19 16:00:20.664: V/BluetoothSocket.cpp(3189): abortNative
06-19 16:00:20.664: V/BluetoothSocket.cpp(3189): ...asocket_abort(49) complete
06-19 16:00:20.664: I/ActivityManager(185): No longer want com.google.android.partnersetup (pid 3220): hidden #16
06-19 16:00:20.671: V/BluetoothSocket.cpp(3189): availableNative
06-19 16:00:20.671: V/BluetoothSocket.cpp(3189): destroyNative
06-19 16:00:20.671: V/BluetoothSocket.cpp(3189): ...asocket_destroy(49) complete
06-19 16:00:20.679: D/KeyguardViewMediator(185): setHidden false
06-19 16:00:20.679: W/System.err(3189): java.io.IOException: socket closed
06-19 16:00:20.679: W/System.err(3189):     at android.bluetooth.BluetoothSocket.available(BluetoothSocket.java:370)
06-19 16:00:20.679: W/System.err(3189):     at android.bluetooth.BluetoothInputStream.available(BluetoothInputStream.java:40)
06-19 16:00:20.679: W/System.err(3189):     at java.io.BufferedInputStream.available(BufferedInputStream.java:114)
06-19 16:00:20.687: W/System.err(3189):     at ebs.alphadidact.control.ReceiveThread.run(ReceiveThread.java:79)

此外,LogCat 接收了一千次消息:

V/BluetoothSocket.cpp(3189): availableNative

因此,当我在网上搜索时,我发现有几个人有类似的问题,但没有解决方案。有人知道这个问题吗?

也许这是天线和android 4.0之间的兼容性问题。我不认为错误出在我的代码中,因为正如我所说,相同的代码可以在较旧的 android 版本上完美运行。

好的,我发现了问题所在。我不确定这只是三星问题还是Android ICS问题。

我尝试像往常一样使用(获取插座)连接到天线:

clientSocket = device.createRfcommSocketToServiceRecord(MY_UUID);

好吧,我的天线和平板电脑设置似乎不起作用,所以我尝试了:

clientSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);

这确实有效。第一个选项强制系统取消配对天线,然后要求再次配对。

实际上,创建不安全的套接字与连接两个未配对的设备相同。这显然不是处理它的最佳方式。

我发现Android尝试修复设备,然后拒绝配对响应。在此异常行为之后,它将接受下一次连接尝试!

我还尝试了Android错误跟踪器:蓝牙RFCOMM服务器插座不再正确连接到ICS 4.0.3上的嵌入式设备。

仍在等待回复...

感谢@fuentessifuentes答案,我写了这个方法,包括向后兼容性:

private BluetoothSocket createBluetoothSocket(BluetoothDevice device) throws IOException {
    if(Build.VERSION.SDK_INT >= 10){
        try {
            final Method  m = device.getClass().getMethod("createInsecureRfcommSocketToServiceRecord", new Class[] { UUID.class });
            return (BluetoothSocket) m.invoke(device, SPP_UUID);
        } catch (Exception e) {
            Log.e(TAG, "Could not create Insecure RFComm Connection",e);
        }
    }
    return  device.createRfcommSocketToServiceRecord(SPP_UUID);
}

也许它有助于索蒙,摆脱这个伊苏。

我相信

我看到了同样的问题。 我正在使用来自 Google Play 的 spp 终端应用程序,该应用程序在将设备与我的库存机器人 x 配对后运行良好。但是现在,使用具有相同应用程序和相同设备的Galaxy s3需要我每次重新配对。

您的解决方案是一种解决方法。似乎android在ICS中改变了这种行为。 因此,真正的解决方法是谷歌修复ICS,以允许spp设备在不配对的情况下配对和连接。

但是,我确实看到了一些解决类似问题的代码:

BluetoothSocket mSocket = null;
mBluetoothAdapter.cancelDiscovery();
Method method;
try {
    method = mBluetoothDevice.getClass()
        .getMethod("createRfcommSocket", new Class[] { int.class});
    mSocket = (BluetoothSocket) method.invoke(mBluetoothDevice,1);
} catch (NoSuchMethodException e1) {
    e1.printStackTrace();
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}
mSocket.connect();

使用此代码:

BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
mBluetoothAdapter.cancelDiscovery();
Method m;
try {
    m = device.getClass().getMethod("createInsecureRfcommSocket", new Class[] { int.class });
    btSocket = (BluetoothSocket) m.invoke(device, 1);
} catch (SecurityException e1) {
    e1.printStackTrace();
} catch (NoSuchMethodException e1) {
    e1.printStackTrace();
} catch (IllegalArgumentException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}

并将以下内容添加到我们的应用程序中 清单有效

<uses-sdk android:minSdkVersion="13" android:targetSdkVersion="16"/>

相关内容

  • 没有找到相关文章

最新更新