我正在编写一个应用程序,它将平板电脑的字节代码发送到μ控制器。在联想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版本上运行。
答案 0 :(得分:4)
好的,我发现了问题所在。我不确定这只是一个三星问题还是Android ICS问题。
我试图像往常一样使用(获取Socket)连接到天线:
clientSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
好吧,我的天线和平板电脑设置似乎无法解决,所以我尝试了:
clientSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
这确实有效。第一个选项强制系统取消配对天线,然后再次请求配对。
答案 1 :(得分:2)
实际上创建一个不安全的套接字与连接两个不成对的设备相同。 这显然不是处理它的最佳方式。
我发现Android尝试修复设备,然后拒绝配对响应。在这种眩晕行为之后,它将接受下一次连接尝试!
我还尝试过Android bugtracker:Bluetooth RFCOMM Server Socket no longer connects properly to embedded device on ICS 4.0.3。
仍在等待回复...
答案 2 :(得分:2)
感谢@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);
}
在这个问题中,也许它有助于somone。
答案 3 :(得分:1)
我相信我也遇到了同样的问题。我正在使用谷歌播放的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();
答案 4 :(得分:0)
使用此代码:
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();
}
并将以下内容添加到我们的应用Manifest工作
<uses-sdk android:minSdkVersion="13" android:targetSdkVersion="16"/>