我尝试在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创建套接字但他没有关闭它。也许我的先入之见不对,所以我想提供帮助。
答案 0 :(得分:0)
经过一番搜索,我发现this thread的海报似乎得到了同样的例外(尽管它是意大利语,所以我真的不明白......)。如果向下滚动一点,您将看到针对此本机异常(__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()
关闭它也是如此,因此您无法使用相同的设置重新创建任何套接字。
解决方案取决于您的应用程序受众:
BluetoothAdapter.disable()
,然后重新启用它。这是一种非常糟糕的用户体验,因为应用程序不应在不首先询问用户的情况下禁用蓝牙。但它会解决您的问题,因为所有蓝牙文件描述符都将自动处理。因此,如果唯一的用户是您,那么这是一个可能的解决方案。