Android: pase el objeto a través de bluetooth

El ejemplo de chat Bluetooth para Android es muy útil para aprender cómo pasar cadenas entre teléfonos – ¿es posible utilizar el mismo código para pasar objetos entre teléfonos? Tengo las mismas clases definidas en ambos teléfonos, sólo quiero pasar la instancia de una clase de un teléfono a otro. ¿Hay algún código de ejemplo disponible? Intenté utilizar la serialización y la sustitución de outputstream y inputstream en el ejemplo de chat con objectoutputstream y objectinputstream pero no parecía funcionar

La mejor manera que encontré para manejar esto fue la siguiente:

  1. Configuré mis objetos como implementar Serializable que quería enviar.
  2. Configuré el siguiente código para gestionar los mensajes:

    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(); 
  3. He cambiado las instrucciones de escritura para aceptar un Serializable, y luego hacer la escritura final:

     /** * 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); } } 

El ejemplo de Bluetooth Chat es una demostración de usar el Perfil de Puerto Serial (SPP) que se basa en RFCOMM. Usted puede enviar en serie a través de los datos que desee una vez que la conexión se establece, Simplemente tiene que ser capaz de representar a sus objetos en una serie de secuencias de bytes, es decir, serializarlos.

Por lo tanto, el uso de la serialización sin duda sería una forma de obtener sus objetos enviados a través del enlace. Las funciones de envío y recepción de la API de Bluetooth se ocupan de los arreglos de bytes, pero se podría adaptar fácilmente el ejemplo de Chat Bluetooth para usar flujos, por ejemplo, la función de envío leería los bytes de un flujo y los pondría en un búfer de arreglo, , Etc. Entonces el código de la aplicación hablaría simplemente vía la entrada y las pipas de la corriente de la salida – que es una manera que lo he hecho en el pasado.

Así que no hay nada malo en tu idea real. El problema más grande es que la forma en que lo has implementado no está bien, y más problemático todavía es que la forma en que has hecho tu pregunta es bastante pobre, también. Usted necesita ser más descriptivo sobre exactamente qué no trabajó, explicar qué depuración usted ha intentado ya, muestras del código del poste y salidas de Logcat así que podemos ayudarle correctamente.

Por último, encontré lo que creo que es un error en el ejemplo de código de Bluetooth Chat: La función de recepción de datos pasa una referencia de la matriz de bytes de recepción a la ArrayList que se utiliza para mostrar cada línea de texto recibido. Esto está bien cuando se envían pequeñas cantidades de texto lento a través, pero cuando intenta enviar grandes cantidades de datos, comienza a ver los datos dañados, presumiblemente porque el adaptador ArrayList sigue leyendo bytes fuera de esa misma matriz cuando el Matriz se está llenando con datos aún más nuevos.

La respuesta es sí. Una cadena es un objeto. ¿Recuerda? Pero cómo exactamente hacerlo, todavía estoy buscando una solución y eso es lo que me trajo aquí …

Trev16v, En primer lugar, gracias por su retroalimentación inicial.

Para serializar mi objeto, utilicé las clases serializeObject y deserializeObject de http://www.jondev.net/articles/Android_Serialization_Example_(Java ) Parece que funcionan bien: si serializo un objeto (creado a partir de una clase que implementa Serializable) desde un teléfono / actividad y deserializar desde el mismo teléfono que logro obtener un objeto fuera del byte generado [].

Entonces intenté utilizar el mismo código en la clase BluetoothChatServices en el ejemplo del chat del bluetooth en oder para enviar el objeto serializado al otro teléfono (en ese ejemplo hay

  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; } 

Y los bytes se pasan usando

 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); } } 

Y leer usando

  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; } } } 

El problema con el uso de BluetoothChatServices como es es que la matriz de bytes recibidos en el otro teléfono es diferente de la enviada cuando se trata de objetos serializados. Por ejemplo, para dar un elemento idea [0] del objeto serializado es = -84 cuando lo envío, el que recibo del otro teléfono tiene elemento [0] a [4] = 0, entonces [5] = 4 Y todos los demás elementos tampoco están alineados. He intentado en los métodos de escribir y ejecutar por encima de cambiar Inputstream y Outputstream con ObjectInputStream y ObjectOutputstream pero sin éxito (si se suponía que era la forma de implementarlo, puedo publicar el código que intenté utilizar)

Una vez más, muchas gracias por su ayuda, soy nuevo en todos estos conceptos, así que si estoy hablando tonterías, también me complacerá dirigirme a un tutorial

Gracias

Enfrentando el mismo problema … Cuando estoy enviando una serie de objetos desde un dispositivo Android, los datos se envían correctamente … Pero en recepción de todos los objetos no se construye desde el byte recibido [].

El error ocurre aleatoriamente para cualquier objeto recibido pero el mismo código funciona correctamente en Java … Creo que algunos bytes se pierden al transferir datos de un dispositivo a otro …

Serializable objeto a byte [] y byte [] a la conversión de objetos se puede hacer con el código siguiente

 public static byte[] toByteArray(Object obj) { byte[] bytes = null; ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(new ByteArrayOutputStream()); oos.writeObject(obj); oos.flush(); return bos.toByteArray(); } catch(Exception e) { Log.e("Bluetooth", "Cast exception at sending end ..."); } return bytes; } public static Object toObject(byte[] bytes) { Object obj = null; ObjectInputStream ois = null; try { ois = new ObjectInputStream(new ByteArrayInputStream(bytes)); return ois.readObject(); } catch(Exception ex) { Log.e("Bluetooth", "Cast exception at receiving end ..."); } return obj; } 

En realidad encontré el problema – cuando los bytes se cargan usando

 try { // Read from the InputStream bytes = mmInStream.read(buffer); 

En realidad se cargan en 2 pasos .. Mientras depuración y entrar en el código me encontré con que si primero carga 990 bytes y luego los bytes restantes .. por lo que cuando vuelvo al manejador de interfaz de usuario sólo veo los bytes cargados en el segundo paso ..

Me pregunto si hay una manera de forzar a cargar todos los bytes a la vez

  • Programación de Android Timer vs. scheduleAtFixedRate
  • Llamada desde una excepción de hilo incorrecto
  • Cambiar el color de Switch en Android
  • Error de Geocoder grpc
  • ¿Cómo usar esta palabra clave en un método estático en java?
  • ¿Cómo utilizar las anotaciones de Java para guiar Proguard de Android?
  • ¿Cómo administro subproyectos de submódulo git en Eclipse?
  • Android ListView Swipe para la acción como la lista de Twitter
  • ¿Cómo utilizo un proyecto Java que requiere un nivel de cumplimiento de 1.7 en una ruta de construcción de proyecto de Android?
  • ¿Cómo puedo detectar formas geométricas 2D básicas (por ejemplo, cuadrado, triángulo, círculo) en una imagen JPEG?
  • 'Private static final' miembro de la clase de prueba de unidad de Android cambia el valor a null
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.