在服务或应用程序类中实现蓝牙连接,而不会丢失与设备的连接

2023-12-13

我需要一些帮助,您能否向我解释一下如何将应用程序中的蓝牙连接实现到我的迷你热敏打印机设备中。

场景是这样的。我已经将我的应用程序连接到设备,但是当活动销毁时,连接也断开了。是的,我知道当活动销毁时,活动中的所有任务都会受到影响。 该设备有自己的 SDK。这就是我现在正在使用的。

这就是为什么,我真的需要你的帮助来解决这个问题。 有一些关于此的文档,但对我来说并不完全清楚。

如果您有示例项目,我可以将其用作指南吗?我们将不胜感激。

对不起英语语法。

请帮我解决这个问题。提前致谢 :)


您可以将所有蓝牙连接代码移至服务类中。

考虑使用它作为路线图。

public class BluetoothDataService extends Service {

    final int handlerState = 0;                        //used to identify handler message
    Handler bluetoothIn;
    private BluetoothAdapter btAdapter = null;

    private ConnectingThread mConnectingThread;
    private ConnectedThread mConnectedThread;

    private boolean stopThread;
    // SPP UUID service - this should work for most devices
    private static final UUID BTMODULEUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    // String for MAC address
    private static final String MAC_ADDRESS = "YOUR:MAC:ADDRESS:HERE";

    private StringBuilder recDataString = new StringBuilder();

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("BT SERVICE", "SERVICE CREATED");
        stopThread = false;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("BT SERVICE", "SERVICE STARTED");
        bluetoothIn = new Handler() {

            public void handleMessage(android.os.Message msg) {
                Log.d("DEBUG", "handleMessage");
                if (msg.what == handlerState) {                                     //if message is what we want
                    String readMessage = (String) msg.obj;                                                                // msg.arg1 = bytes from connect thread
                    recDataString.append(readMessage);

                    Log.d("RECORDED", recDataString.toString());
                    // Do stuff here with your data, like adding it to the database
                }
                recDataString.delete(0, recDataString.length());                    //clear all string data
            }
        };


        btAdapter = BluetoothAdapter.getDefaultAdapter();       // get Bluetooth adapter
        checkBTState();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        bluetoothIn.removeCallbacksAndMessages(null);
        stopThread = true;
        if (mConnectedThread != null) {
            mConnectedThread.closeStreams();
        }
        if (mConnectingThread != null) {
            mConnectingThread.closeSocket();
        }
        Log.d("SERVICE", "onDestroy");
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    //Checks that the Android device Bluetooth is available and prompts to be turned on if off
    private void checkBTState() {

        if (btAdapter == null) {
            Log.d("BT SERVICE", "BLUETOOTH NOT SUPPORTED BY DEVICE, STOPPING SERVICE");
            stopSelf();
        } else {
            if (btAdapter.isEnabled()) {
                Log.d("DEBUG BT", "BT ENABLED! BT ADDRESS : " + btAdapter.getAddress() + " , BT NAME : " + btAdapter.getName());
                try {
                    BluetoothDevice device = btAdapter.getRemoteDevice(MAC_ADDRESS);
                    Log.d("DEBUG BT", "ATTEMPTING TO CONNECT TO REMOTE DEVICE : " + MAC_ADDRESS);
                    mConnectingThread = new ConnectingThread(device);
                    mConnectingThread.start();
                } catch (IllegalArgumentException e) {
                    Log.d("DEBUG BT", "PROBLEM WITH MAC ADDRESS : " + e.toString());
                    Log.d("BT SEVICE", "ILLEGAL MAC ADDRESS, STOPPING SERVICE");
                    stopSelf();
                }
            } else {
                Log.d("BT SERVICE", "BLUETOOTH NOT ON, STOPPING SERVICE");
                stopSelf();
            }
        }
    }

    // New Class for Connecting Thread
    private class ConnectingThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final BluetoothDevice mmDevice;

        public ConnectingThread(BluetoothDevice device) {
            Log.d("DEBUG BT", "IN CONNECTING THREAD");
            mmDevice = device;
            BluetoothSocket temp = null;
            Log.d("DEBUG BT", "MAC ADDRESS : " + MAC_ADDRESS);
            Log.d("DEBUG BT", "BT UUID : " + BTMODULEUUID);
            try {
                temp = mmDevice.createRfcommSocketToServiceRecord(BTMODULEUUID);
                Log.d("DEBUG BT", "SOCKET CREATED : " + temp.toString());
            } catch (IOException e) {
                Log.d("DEBUG BT", "SOCKET CREATION FAILED :" + e.toString());
                Log.d("BT SERVICE", "SOCKET CREATION FAILED, STOPPING SERVICE");
                stopSelf();
            }
            mmSocket = temp;
        }

        @Override
        public void run() {
            super.run();
            Log.d("DEBUG BT", "IN CONNECTING THREAD RUN");
            // Establish the Bluetooth socket connection.
            // Cancelling discovery as it may slow down connection
            btAdapter.cancelDiscovery();
            try {
                mmSocket.connect();
                Log.d("DEBUG BT", "BT SOCKET CONNECTED");
                mConnectedThread = new ConnectedThread(mmSocket);
                mConnectedThread.start();
                Log.d("DEBUG BT", "CONNECTED THREAD STARTED");
                //I send a character when resuming.beginning transmission to check device is connected
                //If it is not an exception will be thrown in the write method and finish() will be called
                mConnectedThread.write("x");
            } catch (IOException e) {
                try {
                    Log.d("DEBUG BT", "SOCKET CONNECTION FAILED : " + e.toString());
                    Log.d("BT SERVICE", "SOCKET CONNECTION FAILED, STOPPING SERVICE");
                    mmSocket.close();
                    stopSelf();
                } catch (IOException e2) {
                    Log.d("DEBUG BT", "SOCKET CLOSING FAILED :" + e2.toString());
                    Log.d("BT SERVICE", "SOCKET CLOSING FAILED, STOPPING SERVICE");
                    stopSelf();
                    //insert code to deal with this
                }
            } catch (IllegalStateException e) {
                Log.d("DEBUG BT", "CONNECTED THREAD START FAILED : " + e.toString());
                Log.d("BT SERVICE", "CONNECTED THREAD START FAILED, STOPPING SERVICE");
                stopSelf();
            }
        }

        public void closeSocket() {
            try {
                //Don't leave Bluetooth sockets open when leaving activity
                mmSocket.close();
            } catch (IOException e2) {
                //insert code to deal with this
                Log.d("DEBUG BT", e2.toString());
                Log.d("BT SERVICE", "SOCKET CLOSING FAILED, STOPPING SERVICE");
                stopSelf();
            }
        }
    }

    // New Class for Connected Thread
    private class ConnectedThread extends Thread {
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;

        //creation of the connect thread
        public ConnectedThread(BluetoothSocket socket) {
            Log.d("DEBUG BT", "IN CONNECTED THREAD");
            InputStream tmpIn = null;
            OutputStream tmpOut = null;

            try {
                //Create I/O streams for connection
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) {
                Log.d("DEBUG BT", e.toString());
                Log.d("BT SERVICE", "UNABLE TO READ/WRITE, STOPPING SERVICE");
                stopSelf();
            }

            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }

        public void run() {
            Log.d("DEBUG BT", "IN CONNECTED THREAD RUN");
            byte[] buffer = new byte[256];
            int bytes;

            // Keep looping to listen for received messages
            while (true && !stopThread) {
                try {
                    bytes = mmInStream.read(buffer);            //read bytes from input buffer
                    String readMessage = new String(buffer, 0, bytes);
                    Log.d("DEBUG BT PART", "CONNECTED THREAD " + readMessage);
                    // Send the obtained bytes to the UI Activity via handler
                    bluetoothIn.obtainMessage(handlerState, bytes, -1, readMessage).sendToTarget();
                } catch (IOException e) {
                    Log.d("DEBUG BT", e.toString());
                    Log.d("BT SERVICE", "UNABLE TO READ/WRITE, STOPPING SERVICE");
                    stopSelf();
                    break;
                }
            }
        }

        //write method
        public void write(String input) {
            byte[] msgBuffer = input.getBytes();           //converts entered String into bytes
            try {
                mmOutStream.write(msgBuffer);                //write bytes over BT connection via outstream
            } catch (IOException e) {
                //if you cannot write, close the application
                Log.d("DEBUG BT", "UNABLE TO READ/WRITE " + e.toString());
                Log.d("BT SERVICE", "UNABLE TO READ/WRITE, STOPPING SERVICE");
                stopSelf();
            }
        }

        public void closeStreams() {
            try {
                //Don't leave Bluetooth sockets open when leaving activity
                mmInStream.close();
                mmOutStream.close();
            } catch (IOException e2) {
                //insert code to deal with this
                Log.d("DEBUG BT", e2.toString());
                Log.d("BT SERVICE", "STREAM CLOSING FAILED, STOPPING SERVICE");
                stopSelf();
            }
        }
    }
}

这是需要消化的大量代码,并且需要了解诸如具有蓝牙连接的线程和处理程序之类的内容。

不确定您的专业知识,因此有一些注释将帮助您研究代码,并且日志消息将帮助您理解代码的流程。

另请确保在清单文件 AndroidManifest.xml 中声明此服务

<service android:name=".BluetoothDataService"/>

您需要熟悉的一些主题

http://developer.android.com/guide/topics/connectivity/bluetooth.html

http://developer.android.com/reference/android/app/Service.html

http://developer.android.com/reference/java/lang/Thread.html

http://developer.android.com/reference/android/os/Handler.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在服务或应用程序类中实现蓝牙连接,而不会丢失与设备的连接 的相关文章

随机推荐

  • VTK 帧缓冲区和 OpenCV Mat 数据之间的转换

    我正在 VTK 中可视化数据 我想获取渲染窗口的帧缓冲区并在 OpenCV 应用程序中显示它 我目前正在尝试通过以下方式 void aig VirtualScene Mat cv Mat m typedef unsigned char pi
  • C# 中的密码加密?

    如何在 C 中加密和解密密码 谢谢你的帮助 首先 您实际上并不打算将加密密码保存在任何地方 而是执行单向哈希 例如 SHA 存储该哈希值 然后 当您向用户询问其密码时 您将执行相同的哈希 如果新的哈希值与存储的哈希值匹配 则说明匹配 哈希和
  • 在 python 应用程序中导入 Google Cloud Bigquery api 模块时出错

    我正在尝试将 bigquery 导入到我的 python 应用程序中from google cloud import bigquery并使用 dev appserver py 在本地运行它 但我收到一个错误 File Volumes Bud
  • Linux 上的 CreateFile CREATE_NEW 等效项

    我编写了一个尝试创建文件的方法 不过 我设置了标志 CREATE NEW 因此它只能在它不存在时创建它 它看起来像这样 for handle CreateFileA filePath c str 0 0 NULL CREATE NEW FI
  • ServiceStack客户端添加附件

    我正在使用 ServiceStack ServiceClient Web XmlServiceClient 连接到 Web 服务 有没有办法在请求中添加附件 更多信息 我想做的是避免使用 Microsoft Web Services2 因为
  • Bootstrap-Sass:使用另一个变量覆盖变量

    我在我的一个项目中使用 Bootstrap sass 并且我想使用 Sass 变量对其进行自定义 当然 我创建了一个名为 variables scss 的新 scss 文件 并将其导入到 bootstrap sass 文件之前的主 scss
  • 如何在后续瀑布步骤中检索自适应卡的表单提交

    我正在使用 Bot Framework V4 并且我有一个包含两个步骤的 WaterfallDialog 第一步是捕获表单数据 第二步是处理表单数据 第一步发送回复 private async Task
  • ASP.NET 中第一次单击时按钮 OnClick 未触发?

    protected void ButtonCancel Click object sender EventArgs e Response Redirect Logon aspx 第一次单击取消按钮时这不起作用 确保仅在以下情况下才绑定到事件
  • 关于本地数据库与基于服务的数据库的问题

    我对本地数据库和基于服务的数据库有一些疑问 使用基于服务的数据库是否需要用户安装 SQL Server 如果是这样 有什么办法可以解决吗 本地数据库是否要求用户安装 SQL Server 本地数据库和基于服务的数据库有什么区别 我说的是Vi
  • Java 正则表达式模式

    我需要帮助解决这件事 查看以下正则表达式 Pattern pattern Pattern compile A Za z A Za z Matcher matcher pattern matcher s1 我想查找这样的单词 自制 aaaa
  • 如何在 iPhone 上从 UIWebView 的 HTML 引用本地图像文件?

    我想用 img src temp jpg 在我的 UIWebView 的 HTML 中 如何引用名为的本地文件temp jpg节省宝贵的加载时间 当然 显而易见的选择是 img src 但我不知道我的根在哪里 这将创建一个 URL 对象 其
  • Pyramid 中的 HTML 表单名称数组解析 (Python)

    有什么办法可以Pyramid处理 HTML 表单输入 如下所示
  • 如何像 Spotify 的播放器一样创建居中的 UICollectionView

    我在尝试创建像 Spotify 播放器中那样的 UICollectionView 时遇到了很多困难 其行为如下 对我来说问题有两个 1 如何将单元格居中 以便您可以看到中间的单元格以及左侧和右侧的单元格 如果我创建方形单元格并在每个单元格之
  • 未捕获的 ReferenceError:Flutter 中未定义 firebase

    我无法初始化 Firebase在我的 Flutter 项目中我尝试过输入 the firebase app js firebase auth js and firebase analytics js但我目前正在使用的没有任何效果Fireba
  • MYSQL 没有向我的数据库添加信息

    我有一个表单 用于向数据库添加信息 但查询将无法正常运行 并且根本没有添加信息 这是我尝试执行的 php 代码 但它不断遇到第一个错误或完全转到最后一个 else 语句
  • JavaFX:ListView 未在 GUI 中显示

    我的问题是我的 ListView 在 GUI 上没有显示任何内容 我添加了一个占位符进行测试 它确实显示了占位符文本 但除此之外我无法添加到列表中 我的目标是获得所有客户帐户的列表 我已包含 Account 类 我想在 ListView 中
  • 使用 Java 打印菱形

    我想在 Eclipse 的输出控制台上打印网格形状 基本上 我从用户那里获取了一个整数 它是网格单个边框中的星星数量 这是我到目前为止的代码 public class PrintDiamond public static void main
  • Javascript - 具有多个语句的三元运算符

    这是有效的 JavaScript 吗 我看到一个示例 其中有人在三元运算符条件中使用逗号 它在我的编辑器中被标记为错误 并且该示例未在 Chrome 中运行 然而 它确实在 Firefox 中运行 当我将所有三元语句转换为 if else
  • 无需在“我的帐户”>“在 WooCommerce 中编辑帐户”中输入当前密码即可更改密码

    当用户尝试更改密码时 我想禁用 当前密码 字段 用户通常很难记住密码 当忘记密码时 无法询问当前密码 用户编辑表单是这样的 https woocommerce github io code reference files woocommer
  • 在服务或应用程序类中实现蓝牙连接,而不会丢失与设备的连接

    我需要一些帮助 您能否向我解释一下如何将应用程序中的蓝牙连接实现到我的迷你热敏打印机设备中 场景是这样的 我已经将我的应用程序连接到设备 但是当活动销毁时 连接也断开了 是的 我知道当活动销毁时 活动中的所有任务都会受到影响 该设备有自己的