Android - 通过蓝牙传递对象

Fab*_*bio 5 java android bluetooth

Android的蓝牙聊天示例对于学习如何在手机之间传递字符串非常有用 - 是否可以使用相同的代码在手机之间传递对象?我在两部手机中定义了相同的类,我只想将一个类的实例从一个手机传递到另一个手机.有可用的示例代码吗?我尝试使用序列化并在chatoutputstream和objectinputstream的聊天示例中替换outputstream和inputstream,但它似乎不起作用

Pea*_*oto 7

我发现处理此问题的最佳方法如下:

  1. 我将我的对象设置为实现我想发送的Serializable.
  2. 我设置以下代码来管理消息:

    public byte[] serialize() throws IOException {
        ByteArrayOutputStream b = new ByteArrayOutputStream();
        ObjectOutputStream o = new ObjectOutputStream(b);
        o.writeObject(this);
        return b.toByteArray();
    }
    //AbstractMessage was actually the message type I used, but feel free to choose your own type
    public static AbstractMessage deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
        ByteArrayInputStream b = new ByteArrayInputStream(bytes);
        ObjectInputStream o = new ObjectInputStream(b);
        return (AbstractMessage) o.readObject();
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我更改了write语句以接受Serializable,然后进行最后的写入:

    /**
     * Write to the connected OutStream.
     * @param buffer  The bytes to write
     */
    public void write(AbstractMessage buffer) {
        try {
            Log.v(TAG,"Writing \""+(buffer.serialize())+"\"");
            mmOutStream.write(buffer.serialize());
    
            // Share the sent message back to the UI Activity
            mHandler.obtainMessage(AbstractMessageManager.MESSAGE_WRITE, -1, -1, buffer)
                    .sendToTarget();
        } catch (IOException e) {
            Log.e(TAG, "Exception during write", e);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)


Tre*_*vor 2

蓝牙聊天示例演示了如何使用基于 RFCOMM 的串行端口配置文件 (SPP)。连接建立后,您可以串行发送任何您喜欢的数据;您只需要能够将对象表示为串行字节流,即序列化它们。

因此,使用序列化肯定是通过链接发送对象的一种方法。蓝牙 API 的发送和接收函数处理字节数组,但您可以轻松地调整蓝牙聊天示例以使用流,例如发送函数将从流中读取字节并将它们放入数组缓冲区中,然后发送该缓冲区等等。然后应用程序代码将简单地通过输入和输出流管道进行通信 - 这是我过去完成的一种方式。

所以你的实际想法没有任何问题。更大的问题是你实现它的方式不对,更严重的问题是你提出问题的方式也很糟糕。您需要更准确地描述什么不起作用,解释您已经尝试过的调试,并发布代码示例和 Logcat 输出,以便我们可以正确地帮助您。

最后,我确实发现了蓝牙聊天代码示例中的一个错误:数据接收函数将接收字节数组的引用传递给用于显示接收到的每一行文本的 ArrayList。当传输少量缓慢的文本时,这没什么问题,但是当您尝试发送大量数据时,您开始看到数据被损坏,大概是因为 ArrayList 适配器仍在从同一数组中读取字节。数组正在填充更新的数据。