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
- Android cambia el color del botón de acción flotante
- Descargar rstp stream en android
- Pruebas de unidad de Android: cómo probar un servicio mediante ServiceTestCase
- Android: El tipo java.lang.Enum no se puede resolver
- Causado por: java.lang.IllegalStateException: GoogleApiClient aún no está conectado
- Ocultar cadenas en código ofuscado
- Conecte con los clientes de iOS y Android a SockJS Backend
- Operador de diamante no es compatible
- Formato EditarTexto a moneda con números enteros
- Diferencia entre setBackgroundDrawable () y setBackground ()
- ¿Por qué Android tiene su propia implementación de URI y no utiliza la implementación de Java por defecto?
- Casting node to element dando ClassCastException
- Android Studio No hay opción "Importar muestra" en el menú Archivo
La mejor manera que encontré para manejar esto fue la siguiente:
- Configuré mis objetos como implementar Serializable que quería enviar.
-
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();
-
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
- Android getResource en la clase non activity de una clase Non Activity?
- Objeto serializable en la intención que devuelve como String