当前位置: 首页 > 知识库问答 >
问题:

Android关闭蓝牙插座/线程

宋宏儒
2023-03-14

我正在通过蓝牙连接2台设备,当我按下一台设备上的注销按钮时,我想向另一台设备发送消息(告诉另一台设备也注销),关闭蓝牙连接,并关闭当前活动(即返回我的登录活动)

问题是我总是得到这个异常,这让我觉得我没有正确地关闭我的连接:

java.io.IOException: bt socket closed, read return: -1
    at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:517)
    at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
    at java.io.InputStream.read(InputStream.java:162)
    at com.example.BTService$ConnectedThread.run(BTService.java:269)

BTService.java:269ConnectedThread从输入流读取的位置

当按下logout时,我基本上销毁了< code>MainActivity,并在< code>onDestroy()中停止了我的蓝牙服务:

< code > this . stop service(new Intent(this,BTService.class))

哪个应该调用我的服务的电子(),它调用停止连接()

public static void stopConnect(){
        if (connectThread != null) {
            connectThread.cancel();
            connectThread = null;
        }

        if (connectedThread != null) {
            connectedThread.cancel();
            connectedThread = null;
        }
    }

因此,一旦通过单击注销销毁服务,就应该调用我连接的Threadcancel() 方法:

public static class ConnectedThread extends Thread {
        private BluetoothSocket mmSocket;
        private InputStream mmInStream;
        private OutputStream mmOutStream;

        public ConnectedThread(BluetoothSocket socket) {
            mmSocket = socket;
            InputStream tmpIn = null;
            OutputStream tmpOut = null;

            // Get the input and output streams, using temp objects because
            // member streams are final
            try {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }

            mmInStream = tmpIn;
            mmOutStream = tmpOut;

            //Tell other phone that we have connected
            write("connected".getBytes());
        }

        public void run() {
            byte[] buffer = new byte[1024];  // buffer store for the stream
            int bytes; // bytes returned from read()

            // Keep listening to the InputStream until an exception occurs
            while (!this.isInterrupted()) {
                try {
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);
                    // Send the obtained bytes to the UI activity
                    mHandler.obtainMessage(Constants.MESSAGE_READ, bytes, -1, buffer)
                            .sendToTarget();
                } catch (IOException e) {
                    e.printStackTrace();
                    break;
                }
            }
        }

        /* Call this from the main activity to send data to the remote device */
        public void write(byte[] bytes) {
            try {
                mmOutStream.write(bytes);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        /* Call this from the main activity to shutdown the connection */
        public void cancel() {
            if (mmInStream != null) {
                try {mmInStream.close();} catch (Exception e) {}
                mmInStream = null;
            }

            if (mmOutStream != null) {
                try {mmOutStream.close();} catch (Exception e) {}
                mmOutStream = null;
            }

            if (mmSocket != null) {
                try {mmSocket.close();} catch (Exception e) {}
                mmSocket = null;
            }

            this.interrupt();
        }
    }

我认为我正确地完成了此操作,首先关闭输入和输出流,然后关闭套接字,然后关闭线程。我从这里的答案中得到了这个:断开Android中的蓝牙插座

但是,一旦按下注销键,我就会收到io异常,因为它仍在尝试从输入流中读取。我还尝试将我的输入/输出/套接字关闭代码放在ConnectedThread类之外的方法中,但这会导致同样的问题

共有1个答案

莫乐
2023-03-14

有一个示例项目“android蓝牙聊天”,看起来您使用了略微修改的代码。但是,在该示例中,所有方法都是同步的,并且蓝牙服务具有当前状态的变量。也许,这就是问题所在——蓝牙插座已经关闭,但线程仍然存在。

 类似资料:
  • 我正在开发一个单例BluetoothHelper类。在connectToBTDevice()方法中,调用了一个新线程,在该线程中,蓝牙套接字试图连接到蓝牙设备。不幸的是,它开始时很好,但退出时有一个警告系统。错误如下: BluetoothHelper.java onnectToBTDevice(BluetoothDevice device)方法位于第234行。BluetoothSocket con

  • 我在我的电脑上开发了一个带有python的HIDServer(蓝牙键盘)。有2个服务器套接字(psm 0x11和0x13)正在侦听连接。当我尝试将IPhone连接到计算机时,我收到了一个传入连接(如hcidump中所示),但不知何故,连接被远程主机终止。我的套接字永远无法接受客户端连接。你能帮帮我吗? hciDumps: 启动我的程序后: HCI事件:命令完成(0x0e)plen 4写入扩展查询响

  • 我目前正在编写一个简单的TCP聊天客户端服务器应用程序,它与套接字一起工作。客户端连接到服务器,一旦被接受,就会创建一个新的工作线程来侦听客户端输入。连接到服务器(端口8818处的localhost)工作正常,但只要工作线程在登录java.net之后开始监听更多客户端输入。SocketException:引发连接重置(请参阅下面的堆栈跟踪)。我知道,此异常的一个可能来源可能是服务器或客户端未正确或

  • ap.closeBluetoothAdapter(CALLBACK) 关闭支付宝客户客户端蓝牙模块,该方法将断开所有已建立的蓝牙连接并释放系统资源。 错误码说明 error 描述 12 关闭失败 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"><

  • 本文向大家介绍蓝牙无线电层,包括了蓝牙无线电层的使用技巧和注意事项,需要的朋友参考一下 下图所示的无线电层的位置- 蓝牙无线电层的特征 蓝牙无线电层规定了使用蓝牙技术进行通信的蓝牙收发器设备的要求。 它定义了空中接口,频带,跳频规范和调制技术。 该层负责将数据位从主设备移至从设备,反之亦然。 这是一种工作在10米范围内的低功率系统。 它与IEEE 802.11网络或WiFi一样,在未经许可的2.4

  • 我必须为Android平板电脑开发一个应用程序,要求将文件打印到蓝牙打印机上。 通过蓝牙打印是我应用程序最重要的功能之一。 我尝试了这个项目和这个项目。 它不工作,也不报告任何错误-不要打印。 蓝牙打印机有什么建议吗?