蓝牙创建套接字错误

时间:2013-07-07 16:00:47

标签: android sockets bluetooth serversocket

我尝试在Samsung Galaxy Gio上创建BluetoothServerSocket。

        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        BluetoothServerSocket tmp = null;
        try
        {
            tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME_INSECURE, MY_UUID_INSECURE);
        }
        catch (IOException e)
        {
        }
        mmServerSocket = tmp;

当我不再需要使用套接字时,我就关闭它。

    public void cancel()
    {
        try
        {
            mmServerSocket.close();
        }
        catch (IOException e)
        {
        }
    }

在这两种情况下都不会抛出异常。所以我的问题是。当我尝试再次使用第一个代码时(不从应用程序退出)Log cat显示异常:

07-07 18:27:44.239: D/BluetoothSocket(13672): create BluetoothSocket: type = 1, fd =-1,
uuid = [null], port = 25
07-07 18:27:44.339: E/BLZ20_WRAPPER(13672): ##### ERROR : __listen_prot_rfcomm: failed       
with reason 1#####

直到那时我才重启我的手机或TurnOFF \等等\ TurnOn我的蓝牙。所以我认为问题是BluetoothServerSocket创建套接字但他没有关闭它。也许我的先入之见不对,所以我想提供帮助。

1 个答案:

答案 0 :(得分:0)

经过一番搜索,我发现this thread的海报似乎得到了同样的例外(尽管它是意大利语,所以我真的不明白......)。如果向下滚动一点,您将看到针对此本机异常(__listen_prot_rfcomm: failed with reason 1)抛出的java异常。 java异常是java.io.IOException: Bad file number

您可以在线上的许多主题中找到此问题(Android Bluetooth IOException bad file numberBluetooth failed to get port number)。从这两个我们可以了解到这个问题是特定于设备的。有些设备似乎使套接字的文件描述符保持活动状态,即使用BluetoothServerSocket.close()关闭它也是如此,因此您无法使用相同的设置重新创建任何套接字。

解决方案取决于您的应用程序受众:

  • 如果您不打算在Play商店/任何其他市场发布,可以致电BluetoothAdapter.disable(),然后重新启用它。这是一种非常糟糕的用户体验,因为应用程序不应在不首先询问用户的情况下禁用蓝牙。但它会解决您的问题,因为所有蓝牙文件描述符都将自动处理。因此,如果唯一的用户是您,那么这是一个可能的解决方案。
  • 如果你计划发布这个,你应该找到一个真正的解决方案......这可能并不容易,但这确实是一个主要问题,似乎很多设备都受到影响它,因此只要此问题仍然存在,您就无法发布应用。