【问题标题】:BluetoothServerSocket accept fails and throws an IOExceptionBluetoothServerSocket 接受失败并抛出 IOException
【发布时间】:2012-07-10 20:16:30
【问题描述】:

我有一个支持 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 seconds20000 ms. 的每个传入连接,当时间到时,应用程序将像这样抛出 IOException

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

这告诉我我的设备无法连接到我的安卓手机。该设备的显示屏上没有连接按钮,只有发送功能,可以将文件发送到我的手机。我相信这个发送功能也会在后台进行连接,但我不确定。

任何人都可以为我确定任何解决方案吗?我在Samsung Galaxy SIIIAndroid 4.0.4 上运行我的应用程序

【问题讨论】:

  • 三星 xcover 上的相同问题,似乎是三星问题,因为我的其他设备使用相同的代码运行良好。我向三星支持报告了这个问题,但我不期待......所以我会开始一个小赏金。

标签: android bluetooth


【解决方案1】:

我终于解决了,问题是不同的Android版本和不同的设备似乎需要不同的socket。我用三星 Galaxy XCOVER、Tab1、Tab2、Nexus、Note、摩托罗拉 Defy 和 HTC Flyer 进行了尝试。 我使用的套接字是:

答:

Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
mSocket = (BluetoothSocket) m.invoke(mmDevice, Integer.valueOf(1));

乙:

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 适用于带有 A、B 的 Nexus、Flyer、Tab1 Android 4.0.3 适用于带有 B 的 Tab2 Android 3,6,x 适用于 DEFY 与 A,B Android 2.3.6 适用于带有 C 的 XCOVER

我找不到适用于所有设备的解决方案,而且我无法在我创建和使用 Socket 之前找到女巫套接字可以工作,尤其是 XCOVER 对所有 Socket 执行 connect() 而不抛出异常,但如果我尝试 tro write() 就会捕获。因此,如果您想设置一个适用于所有设备的 bloothoh 连接,您必须创建套接字,连接一个写入,然后记住该套接字的工作原理(例如在首选项中)

【讨论】:

  • 您能分享一下您是如何编写首选项的吗?我无法在首选项中保存套接字,因为它只能保存数字、布尔值和字符串。
  • 我不保存套接字而是一个整数。然后我在 OnCreate 中有一个 switch() 并决定我使用哪个套接字和一个 OptionMenu 来更改套接字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
相关资源
最近更新 更多