2011-11-25 18 views
6

Invio immagini tramite Bluetooth in modo pro grammatico. Quando invio l'immagine come array Byte sul lato di invio la lunghezza dell'array di byte è = 83402 e sul lato ricevente sto ottenendo il numero di byte 1024.lotti di array di byte Android

Voglio combinare questi 1024 lotti in array di byte singolo in modo che io di nuovo convertirlo come immagine.

Qui nel file msg.obj ottengo 1024 bacth di array di byte.

caso MESSAGE_READ:

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

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

Dopo che sto anche ottenendo questo avvertimento ..

"dimensione del buffer predefinito utilizzato nel costruttore BufferedOutputStream Sarebbe meglio essere espliciti se è richiesto un buffer 8k. "

qualsiasi aiuto sarebbe apprezzato.

Grazie

risposta

1

dovrebbe essere all'incirca qualcosa di simile:

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

ho intenzione di andare su un arto qui e assumere che si sta utilizzando il BluetoothChat example dal SDK per costruire la vostra immagine del mittente (tutti i tuoi esempi corrispondono). Ecco una rapida conversione che ho buttato insieme - potrebbe non essere la migliore ma funziona.

Li stai facendo in batch di 1024 perché nella funzione di esecuzione di BluetoothChatService.java crea una dimensione di array di buffer 1024 che va e ottiene informazioni dal flusso di input. Se si crea un altro buffer che si adatta l'immagine lì (ho impostato un 1 MB max), allora la funzione eseguire avrebbe:

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

con il POS tenuta variabile traccia di dove siete nel vostro imgBuffer.

Poi basta copiarlo nel mentre che stai ricevendo pezzi nel while (true) ciclo dell'immagine come questo (mmInStream è un InputStream):

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

mando un messaggio per fargli sapere che l'immagine è fatta l'invio e in quel navetta punto l'imgBuff verso l'altro thread (pos ha le dimensioni del imgBuffer a questo punto):

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

avevo definito IMAGE_READ per decodificare la matrice come avete fatto in your MESSAGE_READ: