2011-11-25 40 views
6

Tôi đang gửi hình ảnh qua Bluetooth theo ngữ pháp một cách chuyên nghiệp. Khi tôi gửi hình ảnh dưới dạng mảng Byte ở phía gửi, chiều dài mảng byte là = 83402 và ở phía bên nhận tôi nhận được bacthes byte là 1024.Lô mảng byte Android

Tôi muốn kết hợp các lô 1024 này thành mảng byte đơn sao cho tôi lại chuyển đổi nó thành một hình ảnh.

Ở đây trong msg.obj tôi nhận được 1024 bacth mảng byte.

trường hợp MESSAGE_READ:

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

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

Sau đó tôi đang cũng nhận được cảnh báo này ..

"Default đệm kích thước được sử dụng trong BufferedOutputStream constructor Sẽ tốt hơn để được rõ ràng nếu một đệm 8k là bắt buộc. "

mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn

Trả lời

1

nên được khoảng một cái gì đó như thế này:

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

tôi sẽ đi ra ngoài cánh một ở đây và giả sử bạn đang sử dụng BluetoothChat example từ sdk để xây dựng người gửi hình ảnh của bạn (tất cả các ví dụ của bạn phù hợp với nó). Đây là một chuyển đổi nhanh chóng tôi đã ném cùng nhau - có thể không phải là tốt nhất nhưng nó hoạt động.

Bạn nhận được chúng theo lô 1024 vì trong chức năng chạy BluetoothChatService.java, nó tạo ra kích thước mảng bộ đệm 1024 đi và nhận thông tin từ luồng đầu vào. Nếu bạn tạo một bộ đệm mà sẽ phù hợp với những hình ảnh đó (tôi đặt một 1mb max) sau đó chức năng chạy của bạn sẽ có:

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

với pos của bạn biến lưu giữ theo dõi của bạn đang ở đâu imgBuffer của bạn.

Sau đó, bạn chỉ cần sao chép nó qua trong khi bạn đang nhận được những phần trong while (true) vòng lặp của hình ảnh như thế này (mmInStream là một InputStream):

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

tôi gửi một tin nhắn để cho nó biết rằng hình ảnh được thực hiện gửi và tại đưa đón quan điểm imgBuff giao cho các chủ đề khác (pos có kích thước của imgBuffer vào thời điểm này):

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

tôi đã định nghĩa IMAGE_READ để giải mã các mảng như bạn đã làm trong MESSAGE_READ của bạn: