我有一个支持OBEX对象推送配置文件的设备,此配置文件基于串行端口配置文件。我的猜测是我可以使用Android蓝牙聊天示例将此设备连接到我的Android手机。但是我遇到了一个问题,关于android SDK中的socket.accept()
功能。我尝试完成将手机连接到此设备,如下所示:
adapter = BluetoothAdapter.getDefaultAdapter();
device = adapter.getRemoteDevice("00:1B:DC:0F:EC:7E");
AcceptThread = new AcceptThread(true, adapter, device);
AcceptThread.start();
AcceptThread中的构造函数编码如下:
public AcceptThread(boolean secure, BluetoothAdapter adapter, BluetoothDevice device) {
BluetoothServerSocket tmp = null;
this.adapter = adapter;
this.device = device;
// Create a new listening server socket
try {
tmp = adapter.listenUsingInsecureRfcommWithServiceRecord(device.getName(), UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
} catch (Exception e) {
Log.e(TAG, ".AcceptThread # listen() failed", e);
}
mmServerSocket = tmp;
}
问题是当我尝试按照之前的说法做connect()
时
public void run() {
BluetoothSocket socket = null;
// Listen to the server socket if we're not connected
while (mState != STATE_CONNECTED) {
try {
// This is a blocking call and will only return on a
// successful connection or an exception
Log.d(TAG, "AcceptThread.run: accepting server socket connection");
socket = mmServerSocket.accept(20000);
Log.d(TAG, ".AcceptThread.run # server socket connection accepted");
} catch (Exception e) {
Log.e(TAG, ".run # accept() failed: "+e);
break;
}
}
}
正如您所看到的,ServerSocket接受20 seconds
或20000 ms.
的每个输入连接。当时间到了,应用程序将抛出这样的IOException
07-11 10:30:08.355: E/SIMPLECONNECT(1301): .run # accept() failed: java.io.IOException: Connection timed out
告诉我我的设备无法连接到我的Android手机。设备没有显示器上的连接按钮,只是一个发送功能,它将文件发送到我的手机。我相信这个发送功能也在后台进行连接,但我不确定。
任何人都可以为我找出任何解决方案吗?我正在使用Samsung Galaxy SIII
Android 4.0.4
上运行我的应用
答案 0 :(得分:9)
我终于解决了它,问题是不同的Android版本和不同的设备似乎需要不同的套接字。我尝试使用三星Galaxy XCOVER,Tab1,Tab2,Nexus,Note,Motorola Defy和HTC Flyer。 我使用的套接字是:
A:
Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
mSocket = (BluetoothSocket) m.invoke(mmDevice, Integer.valueOf(1));
B:
Method m = mmDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[]{int.class});
mSocket=(BluetoothSocket)m.invoke(mmDevice,Integer.valueOf(1));
C:
mSocket=BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mmDevice.getAddress()).createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
Android 4.0.x适用于Nexus,Flyer,Tab1和A,B Android 4.0.3适用于带有B的Tab2 Android 3,6,x适用于带有A,B的DEFY Android 2.3.6适用于带有C
的XCOVER我找不到适用于所有设备的解决方案和我;在我创建和使用Socket之前无法找到插座工作,尤其是XCOVER为所有插槽执行connect()而不抛出例外,但如果我尝试tro write(),请抓住。因此,如果你想设置一个bloothoh连接,它适用于你必须创建套接字的所有设备,连接一个写,然后记住有效的套接字(例如在偏好中)