2

我尝试在三星 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\wait\TurnOn 我的蓝牙。所以我认为问题在于 BluetoothServerSocket 创建了套接字,但他没有关闭它。也许我的先入之见是不对的,所以我想帮忙。

4

1 回答 1

0

经过一番搜索,我发现这个帖子的海报似乎得到了同样的例外(虽然它是意大利语,所以我不太明白......)。如果您向下滚动一点,您将看到针对此本地异常 ( __listen_prot_rfcomm: failed with reason 1) 引发的 java 异常。Java 例外是java.io.IOException: Bad file number.

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

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

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