【问题标题】:Variables that are needed for Bluetooth Connection蓝牙连接所需的变量
【发布时间】:2014-08-25 03:41:25
【问题描述】:

目前,我正在尝试弄清楚如何在整个活动期间通过蓝牙与设备保持连接。我初始化了一些变量以使连接继续进行。

我之前的活动流程是主页 > 用户输入文本页面 > 蓝牙连接(发送信息)。

这样,每次我回到用户输入文本页面时,蓝牙连接都会被重置,因为当我进入下一页时,它会重新运行所有接收器和东西。

现在我正在向前移动蓝牙连接。现在的意思是主页 > 蓝牙连接 > 用户输入文本页面(发送)。

但是在我的蓝牙连接页面上连接后,我不确定我应该在SharedPreferences 中引入/保存哪些变量,以便蓝牙连接保持不变并且我可以立即发送。

//This method runs when I click a device on my ListView.
    private OnItemClickListener mDeviceClickListener = new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // Cancel discovery because it's costly and we're about to connect

                bluetoothAdapter.cancelDiscovery();
                System.out.println("Bluetooth Adapter2 = "
                        + bluetoothAdapter.cancelDiscovery());
                SiriListItem item = delist.get(arg2);
                mAdapter.notifyDataSetChanged();
                // When device being clicked
                count++;
                click = 1;
                // Get the device MAC address, which is the last 17 chars in the
                // View
                String info = item.message;
                String address = info.substring(info.length() - 17);
                BlueToothAddress = address;
                if (click == 1) {
                    clientThread ct = new clientThread();
                    ct.start();

                }
            };
        };

//This is the clientThread if click == 1, it'll start this.
private class clientThread extends Thread {
        public void run() {

            try {
                //
                bdDevice = bluetoothAdapter.getRemoteDevice(BlueToothAddress);
                socket = bdDevice.createRfcommSocketToServiceRecord(UUID
                        .fromString("00001101-0000-1000-8000-00805F9B34FB"));
                Message msg2 = new Message();
                msg2.obj = "Please wait, connecting to server: "
                        + BlueToothAddress;
                msg2.what = 0;
                LinkDetectedHandler.sendMessage(msg2);
                socket.connect();
                Log.i("tag", "This is the pairing section");

                Message msg = new Message();
                msg.obj = "Device connected. Sending message is allowed.";
                msg.what = 0;
                LinkDetectedHandler.sendMessage(msg);

                readThread = new readThread();
                readThread.start();
                click++;

            } catch (IOException e) {
                Message msg = new Message();
                msg.obj = "Error! Can't connect to device. Please try again.";
                msg.what = 0;
                LinkDetectedHandler.sendMessage(msg);
                click--;

            }
        }
    };

public class readThread extends Thread {
        public void run() {

            byte[] buffer = new byte[1024];
            int bytes;
            InputStream mmInStream = null;
            String tmp = null;
            try {
                mmInStream = socket.getInputStream();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            while (true) {
                try {
                    // read the data from the inputStream
                    if ((bytes = mmInStream.read(buffer)) > 0) {
                        for (int i = 0; i < bytes; i++) {
                            tmp = "" + buffer[i];
                            String st = new String(tmp);
                            tmp = null;
                            Message msg = new Message();
                            msg.obj = st;
                            msg.what = 1;

                        }
                    }
                } catch (IOException e) {
                    try {
                        mmInStream.close();
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    break;
                }
            }
        }
    }

//On Click it'll send the message stored in the editText.
buttonConnect.setOnClickListener(new View.OnClickListener() {

            @SuppressLint("NewApi")
            @Override
            public void onClick(View arg0) {
                if (count == 0) {
                    Toast.makeText(bluetoothtest.this,
                            "Please connect to a device first.",
                            Toast.LENGTH_LONG).show();
                }
                // Need API=14
                else if (!socket.isConnected()) {
                    Toast.makeText(bluetoothtest.this,
                            "Connecting! Please wait.", Toast.LENGTH_LONG)
                            .show();
                } else {
                    try {
                        sendMessageHandle(contentRow1.getText().toString(),
                                contentRow2.getText().toString(), contentRow3
                                        .getText().toString(), contentRow4
                                        .getText().toString());
                        // sendMessageHandle(contentRow2.getText().toString());

                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }

            }
        });

所以最重要的是。我的用户输入文本页面应该有什么方法?我必须在我的用户输入文本页面中拥有所有这些方法,还是可以通过SharedPreferences 引入变量?

谢谢。

【问题讨论】:

    标签: android bluetooth


    【解决方案1】:

    在主线程上处理蓝牙连接可能是不好的做法。您应该真正通过服务/后台线程处理蓝牙连接/维护。然后,您的活动可以通过 BroadcastReceiver 和句柄与服务对话。

    【讨论】:

    • 所以你的意思是,我不需要将任何东西带到我的输入文本页面活动中?您介意多解释一下,还是给我一些示例的链接?
    • 当然。您要做的是创建一个服务来处理您的蓝牙连接并维护此连接的状态(在后台线程上)。然后,该服务可以广播您的相关活动可以从中接收的消息。我建议看一下BlueTerm——它是一个开源的蓝牙终端模拟器,正如我所描述的那样,它恰好使用了蓝牙服务。我不会撒谎,一开始可能会让人望而生畏;但是,它确实运作良好。
    • 所以基本上我在蓝牙活动中所拥有的,是去扩展服务的那个类?我是否需要有一个扩展 Thread 的类或者该 Service 类已经像 Thread 一样工作?所以我只是将我的整个 bluetooth.class 转储到一个扩展 Service 的新类中?我已经阅读了 BlueTerm,但我仍然有点不确定。
    • 基本上,是的。不过,我可以根据经验告诉您,这不会像将代码复制到服务那样简单。 IMO,Android中的蓝牙实现起来并非易事。我强烈建议甚至从 BlueTerm 的代码库开始(至少对于蓝牙服务)并对其进行修改以满足您的需求。正如我之前提到的,您还应该研究 BroadcastReceiver 模式以在您的活动和 BT 服务之间进行通信。
    • 好的。我会更深入地看一下,看看我是否能弄清楚一些事情。谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2016-12-13
    相关资源
    最近更新 更多