2011-11-25 8 views
6

estoy enviando la imagen a través de Bluetooth pro-gramatical. Cuando envío una imagen como matriz de bytes en el lado de envío, la longitud de la matriz de bytes es = 83402 y en el lado de recepción obtengo bytes de 1024.byte Android lotes matriz

Quiero combinar estos 1024 lotes en una matriz de un solo byte para que vuelva a convertirlo como una imagen.

Aquí en el msg.obj me sale 1024 bacth de matriz de bytes.

caso MESSAGE_READ:

byte[] readBuf = (byte[]) msg.obj; 

Bitmap bmp=BitmapFactory.decodeByteArray(readBuf,0,readBuf.length); 

Después de eso También estoy recibiendo esta advertencia ..

"tamaño de búfer predeterminado utilizado en BufferedOutputStream constructor Sería mejor ser explícita si se requiere una memoria intermedia 8k. "

cualquier ayuda se agradece.

Gracias

Respuesta

1

debe ser aproximadamente así:

byte[] readBuf = new byte[83402]; // this array will hold the bytes for the image, this value better be not hardcoded in your code 

int start = 0; 
while(/*read 1024 byte packets...*/) { 
    readBuf.copyOfRange((byte[]) msg.obj, start, start + 1024); // copy received 1024 bytes 
    start += 1024; //increment so that we don't overwrite previous bytes 
} 

/*After everything is read...*/ 
Bitmap bmp=BitmapFactory.decodeByteArray(readBuf,0,readBuf.length); 
0

voy a salir a un miembro aquí y asumir que está utilizando el BluetoothChat example desde el SDK para construir su imagen emisor (todos tus ejemplos lo combinan). Aquí hay una conversión rápida que armé, puede que no sea la mejor, pero funciona.

Los obtiene en lotes de 1024 porque en la función de ejecución BluetoothChatService.java crea una matriz de almacenamiento intermedio de 1024 tamaño que recibe información del flujo de entrada. Si crea otro búfer que se ajuste a la imagen hay (I fijar un máximo de 1 MB), entonces su función de ejecutar tendría:

byte[] buffer = new byte[1024]; 
byte[] imgBuffer = new byte[1024*1024]; 
int pos = 0; 

con su punto de venta hacer el seguimiento variables de dónde se encuentra en su imgBuffer.

A continuación, sólo copiarlo mientras que está recibiendo trozos en el while (true) bucle de la imagen como esta (mmInStream es un InputStream):

int bytes = mmInStream.read(buffer); 
System.arraycopy(buffer,0,imgBuffer,pos,bytes); 
pos += bytes; 

envío un mensaje para hacerle saber que la imagen se hace el envío y en ese transporte al punto de la imgBuff al otro hilo (POS tiene el tamaño de la imgBuffer en este punto):

mHandler.obtainMessage(BluetoothChat.IMAGE_READ, pos, -1, imgBuffer) 
         .sendToTarget(); 

había definido IMAGE_READ para decodificar la matriz como lo hizo en su MESSAGE_READ: