BluetoothServerSocket接受失败并抛出IOException

Tob*_*sen 3 android bluetooth

我有一个支持OBEX对象推送配置文件的设备,此配置文件基于串行端口配置文件.我的猜测是我可以使用Android蓝牙聊天示例将此设备连接到我的Android手机.但是我遇到了一个问题,关于socket.accept()android SDK中的功能.我尝试完成将手机连接到此设备,如下所示:

adapter = BluetoothAdapter.getDefaultAdapter(); 
device = adapter.getRemoteDevice("00:1B:DC:0F:EC:7E");

AcceptThread = new AcceptThread(true, adapter, device);
AcceptThread.start(); 
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,ServerSocket接受每个incomming连接,20 seconds或者20000 ms.当时间到了,应用程序将抛出一个像这样的IOException

07-11 10:30:08.355: E/SIMPLECONNECT(1301): .run # accept() failed: java.io.IOException: Connection timed out
Run Code Online (Sandbox Code Playgroud)

这告诉我,我的设备无法连接到我的Android手机.设备没有显示器上的连接按钮,只是一个发送功能,它将文件发送到我的手机.我相信这个发送功能也在后台进行连接,但我不确定.

任何人都可以为我找到任何解决方案吗?我正在我的应用程序上Samsung Galaxy SIII使用Android 4.0.4

2re*_*d13 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));
Run Code Online (Sandbox Code Playgroud)

B:

Method m = mmDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[]{int.class});
mSocket=(BluetoothSocket)m.invoke(mmDevice,Integer.valueOf(1));
Run Code Online (Sandbox Code Playgroud)

C:

mSocket=BluetoothAdapter.getDefaultAdapter().getRemoteDevice(mmDevice.getAddress()).createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
Run Code Online (Sandbox Code Playgroud)

Android 4.0.x适用于Nexus,Flyer,Tab1和A,B Android 4.0.3适用于Tab2和B Android 3,6,x适用于DEFY和A,B Android 2.3.6适用于XCOVER和C

我无法找到一个解决方案女巫适用于所有的设备和I,M不能找到我之前创建巫插座将工作和使用Socket,尤其是XCOVER执行所有套接字的connect()未抛出异常,但抓住,如果我尝试tro写().因此,如果你想设置一个bloothoh连接,它适用于你必须创建套接字的所有设备,连接一个写,然后记住有效的套接字(例如在首选项中)

  • 我不保存套接字而是整数.然后我在OnCreate中有一个switch()并决定我使用哪个套接字和OptionMenu来更改套接字. (2认同)