Android - 通过蓝牙传递对象
Android的蓝牙聊天示例对于了解如何在电话之间传递字符串非常有用 - 是否可以使用相同的代码在电话之间传递对象?我在两部手机中定义了相同的类,我只想将一个类的实例从一部手机传递到另一部手机。有没有可用的示例代码?我尝试使用序列化并在对象输出流和对象输入流的聊天示例中替换outputstream和inputstream,但它似乎不起作用Android - 通过蓝牙传递对象
蓝牙聊天示例演示了如何使用基于RFCOMM的串行端口配置文件(SPP) 。连接建立后,您可以连续发送您喜欢的任何数据;您只需要能够将您的对象表示为串行的字节流,即序列化它们。
因此,使用序列化肯定会让你的对象通过链接发送。蓝牙API的发送和接收功能处理字节数组,但您可以轻松调整蓝牙聊天示例以使用流,例如, send函数会从流中读取字节并将它们放入数组缓冲区,然后发送该缓冲区等。然后,应用程序代码将通过输入和输出流管道进行简单交谈 - 这是我在过去。
所以你的实际想法没有错。更大的问题是,你实施它的方式是不正确的,而且更多的问题仍然是你提问的方式也很差。你需要更准确地描述什么不起作用,解释你已经尝试过的调试,以及发布代码示例和Logcat输出,以便我们可以帮助你。
最后,我找到了什么,我认为是在蓝牙聊天代码示例中的错误:数据接收功能通过接收字节数组来这是我们用来显示文字的每一行收到的ArrayList的一个参考。当少量缓慢文本传输时这是正常的,但是当您尝试发送大量数据时,您开始看到数据被破坏,可能是因为ArrayList适配器仍然在读取同一数组中的字节时数组正在充满更新的数据。
Trev16v, 首先,感谢您的初始反馈。
为了连载我的目标,我使用的类serializeObject和deserializeObject从 http://www.jondev.net/articles/Android_Serialization_Example_(Java) 他们似乎运作良好:如果我连载的对象(被创造出来,从手机/活动实现Serializable接口的类)和从同一部手机反序列化它,我设法从生成的字节[]中获取一个对象。
我又试图使用相同的代码在类BluetoothChatServices蓝牙聊天例如在奥得河的序列化对象发送到对方手机(在这个例子有
public ConnectedThread(BluetoothSocket socket) {
Log.d(TAG, "create ConnectedThread");
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the BluetoothSocket input and output streams
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
Log.e(TAG, "temp sockets not created", e);
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
和字节被传递使用
public void write(byte[] buffer) {
try {
mmOutStream.write(buffer);
// Share the sent message back to the UI Activity
mHandler.obtainMessage(BluetoothChat.MESSAGE_WRITE, -1, -1, buffer)
.sendToTarget();
} catch (IOException e) {
Log.e(TAG, "Exception during write", e);
}
}
,并使用读
public void run() {
Log.i(TAG, "BEGIN mConnectedThread");
byte[] buffer = new byte[10240];
int bytes;
// Keep listening to the InputStream while connected
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(BluetoothManageActivity.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
} catch (IOException e) {
Log.e(TAG, "disconnected", e);
connectionLost();
break;
}
}
}
使用BluetoothChatServices的问题是,在另一部手机上收到的字节数组与从串行化对象发送的字节数不同。例如,为了给出一个想法seriealized对象的元素[0] = -84当我发送它时,我从另一部手机收到的元素[0]到[4] = 0,然后[5] = 4并且所有其他元素也不对齐。我试着用上面的方法编写和运行,用ObjectInputStream和ObjectOutputstream更改Inputstream和Outputstream,但没有成功(如果这应该是实现它的方式,我可以发布我试过的代码)
再次,非常感谢您的帮助,我是新来的所有这些概念,所以如果我说废话我会还高兴
感谢
寻址到一个教程中,我居然发现了问题 - 当字节使用加载
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
他们实际上是在装载2个步骤。而调试和步入我发现的代码,如果第一次加载990个字节,然后其余的字节..所以当我回到UI处理程序我只看到在加载的字节第二步..
我不知道是否有办法迫使一次
答案是肯定的,以加载所有字节。一个字符串是一个对象。记得?但究竟如何做到这一点,我仍然在寻找解决的办法,这就是把我带到这里......
,最好的办法,我发现来处理,这是如下:
- 我建立了我的对象作为实现我想发送的Serializable。
-
我成立了下面的代码来管理邮件:
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();
-
我改变了写语句接受序列化,然后再作出最后的写:
/** * 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); } }
面临同样的问题...当我从一个Android设备发送一系列的对象,数据发送正确...但是在接收端的所有对象不从接收到的字节[]构造。我认为,一些字节失误从一个设备转移到另一个数据时随机发生
误差任何接收的对象,但相同的代码工作正常在Java中......
序列化对象为byte []和字节[]到对象的转换可以用下面的代码完成