Android的蓝牙聊天示例对于学习如何在手机之间传递字符串非常有用-可以使用相同的代码在手机之间传递对象吗?我在两个电话中定义了相同的类,我只想将一个类的实例从一个电话传递到另一个电话。有没有可用的示例代码?我尝试使用序列化,并将聊天示例中的outputstream和inputstream替换为objectoutputstream和objectinputstream,但似乎不起作用
发布于 2013-01-05 05:38:30
我找到的处理这个问题的最好方法是:
公共byte[] serialize()抛出IOException { ByteArrayOutputStream b=新ByteArrayOutputStream();ObjectOutputStream o=新ObjectOutputStream(b);o.writeObject(这);return b.toByteArray();} //AbstractMessage实际上是我使用的消息类型,但请随意选择自己的类型公共静态AbstractMessage反序列化(byte[]字节)抛出IOException,ClassNotFoundException { ByteArrayInputStream b=新ByteArrayInputStream(字节);ObjectInputStream o=新ObjectInputStream(b);return (AbstractMessage) o.readObject();
/** *写入已连接的OutStream。* @param buffer要写入的字节数*/ public void (AbstractMessage buffer) { try { Log.v(TAG,"Writing \""+(buffer.serialize())+"\"");mmOutStream.write(buffer.serialize());//将发送的消息分享回UI Activity .sendToTarget();} catch (IOException e) { Log.e(TAG,“写入异常”,e);} }
发布于 2011-06-08 17:43:31
蓝牙聊天示例演示了如何使用基于RFCOMM的串行端口配置文件(SPP)。一旦建立了连接,您就可以串行发送任何您喜欢的数据;您只需要能够将您的对象表示为串行字节流,即序列化它们。
因此,使用序列化肯定是通过链接发送对象的一种方式。蓝牙API的发送和接收函数处理字节数组,但您可以很容易地将蓝牙聊天示例修改为使用流,例如,发送函数将从流中读取字节并将其放入数组缓冲区,然后发送该缓冲区,等等。然后应用程序代码将简单地通过输入和输出流管道进行通信-这是我过去做过的一种方法。
所以你的实际想法没有错。更大的问题是,你实现它的方式是不正确的,更有问题的是,你问问题的方式也很糟糕。你需要更多地描述什么是不起作用的,解释你已经尝试过的调试,并发布代码样本和Logcat输出,以便我们可以适当地帮助你。
最后,我确实在蓝牙聊天代码示例中发现了一个我认为是bug的东西:数据接收函数将接收字节数组的引用传递给用于显示接收到的每一行文本的ArrayList。当传输少量较慢的文本时,这没有问题,但是当您尝试发送大量数据时,您会开始看到数据被损坏,这可能是因为当数组中填充了更新的数据时,ArrayList适配器仍在从同一数组中读取字节。
发布于 2011-06-09 06:18:58
Trev16v,首先,感谢您的初步反馈。
为了序列化我的对象,我使用了来自http://www.jondev.net/articles/Android_Serialization_Example_(Java的类serializeObject和deserializeObject,它们似乎工作得很好:如果我从phone/activity序列化一个对象(从实现Serializable的类中创建),并从同一个phone反序列化它,我设法从生成的byte[]中获得一个对象。
然后,我尝试在蓝牙聊天示例中的类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的问题是,当涉及到序列化对象时,在另一部电话上接收的字节数组与发送的字节数组不同。例如,要给出序列化对象的idea元素=-84,当我发送它时,我从另一个电话接收到的idea元素为4 =0,然后5=4和所有其他元素也不对齐。我尝试在上面编写和运行的方法中使用ObjectInputStream和ObjectOutputstream更改输入流和输出流,但没有成功(如果这是实现它的方式,我可以发布我尝试使用的代码)
再次,非常感谢你的帮助,我对所有这些概念都是新手,所以如果我是在胡说八道,我也会很高兴得到一个教程
谢谢
https://stackoverflow.com/questions/6275403
复制相似问题