gpt4 book ai didi

java - 489次成功连接后android蓝牙连接失败

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:23:27 39 4
gpt4 key购买 nike

不幸的是,我的安卓蓝牙有一些问题。对于我的测试环境,我使用 Nexus 4 和 Android 4.4.2。

我的 PC 上有一个 Java 应用程序,它使用 bluecove 作为客户端建立 SPP 连接。该程序正在寻找一个特殊的服务名称并连接到我的安卓手机。之后它向我的 android 手机发送 72 个字节并等待答复。当得到这个答案时,程序会 hibernate 3 秒,然后再次启动。

在我的安卓手机上,我有一个带有后台蓝牙监听器的应用程序,它在开机时启动。此应用程序基于 BluetoothChat 示例演示。接收蓝牙数据时,我会检查传入的数据并发回一个答案。

一切正常。但是在 489 个蓝牙连接之后,android 应用程序失败并出现以下错误 fragment ,而 PC-java-app 正在运行:

getBluetoothService() called with no BluetoothManagerCallback
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0x41b34ba8)
FATAL EXCEPTION: main
Process: de.tum.lme.diamantum:remote_blue, PID: 21567
java.lang.NullPointerException: FileDescriptor must not be null
at android.os.ParcelFileDescriptor.<init>(ParcelFileDescriptor.java:174)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:905)
at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:897)
at android.bluetooth.IBluetooth$Stub$Proxy.createSocketChannel(IBluetooth.java:1355)
at android.bluetooth.BluetoothSocket.bindListen(BluetoothSocket.java:349)
at android.bluetooth.BluetoothAdapter.createNewRfcommSocketAndRecord(BluetoothAdapter.java:1055)
at android.bluetooth.BluetoothAdapter.listenUsingRfcommWithServiceRecord(BluetoothAdapter.java:976)
at com.test.btconn.BluetoothHandling$AcceptThread.<init>(BluetoothHandling.java:449)
at com.test.btconn.BluetoothHandling.start(BluetoothHandling.java:216)
at com.test.btconn.BluetoothListenerService.setupBtSockets(BluetoothListenerService.java:330)
at com.test.btconn.BluetoothListenerService.manageBtState(BluetoothListenerService.java:249)
at com.test.btconn.BluetoothListenerService.setBtStateDisconnected(BluetoothListenerService.java:383)
at com.test.btconn.BluetoothListenerService.access$5(BluetoothListenerService.java:378)
at com.test.btconn.BluetoothListenerService$2.handleMessage(BluetoothListenerService.java:421)

所以应用程序的 ParcelFileDescriptor 有问题,它突然为空。但是为什么?

当更改 PC-java-app 上的暂停时间、使用不同的数据大小进行传输和使用不同的智能手机时,也会发生上述所有情况。当使用反射“listenUsingRfcommWithServiceRecord”时,同样的情况发生在 505 次传输之后。同样使用唤醒锁也没有任何改变。

顺便说一句,我在使用 BluetoothChat 示例时遇到了相同的行为。

那么,有没有人提示,会发生什么?

更新:

BluetoothServerSocket 在每次连接后关闭,如果蓝牙状态为 3,则关闭 BluetoothSocket。

最佳答案

问题似乎与设备上文件描述符 的限制有关。有关于该问题的报告 here

在创建蓝牙套接字的过程中,一个新的 fd 是 two new FDs是从系统中获取的。看来您没有正确关闭之前的 BT 连接,因此使用的 FD 数量稳步增加,直到达到限制。

为避免这种情况,您至少必须在完成后从 listenUsingRfcommWithServiceRecord() 调用接收到的 BluetoothServerSocket 上调用 close()它的操作。您还应该检查您是否持有连接到 BT 连接的其他资源,并在可能的情况下释放它们。


这里要求的是如何强制关闭 BluetoothServerSocket 的 ParcelFileDescriptor。 小心:它可能会破坏东西!

您必须访问 BluetoothServerSocketmSocket 字段才能访问底层 BluetoothSocket。此 BluetoothSocket 在字段 mPfd 中保存 ParcelFileDescriptor。然后你可以调用 close()。由于这两个字段都不可见,您将不得不使用Reflections:

public void closePFD(BluetoothServerSocket closeMe) throws AllKindOfExceptionsThatYouHaveToHandle
{
Field mSocketFld = closeMe.getClass().getDeclaredField("mSocket");
mSocketFld.setAccessible(true);

BluetoothSocket btsock = (BluetoothSocket)mSocketFld.get(closeMe);

Field mPfdFld = btsock.getClass().getDeclaredField("mPfd");
mPfdFld.setAccessible(true);

ParcelFileDescriptor pfd = (ParcelFileDescriptor)mPfdFld.get(btsock);

pfd.close();
}

这将关闭 BluetoothServerSocket。如果您只想关闭来自 BTServerSockets 接受方法的 BluetoothSocket,您可以省略获取 mSocket 的部分,如 jitain sharmas answer 中所示。 .

关于java - 489次成功连接后android蓝牙连接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22022001/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com