2011-11-25 22 views
6

我通过蓝牙以编程方式发送图像。当我发送图像作为字节数组在发送端的字节数组长度是= 83402和在接收端我得到的1024字节bacthes。Android字节数组批量

我想将这1024个批次组合成单字节数组,使我再次将其转换为图像。

在这里msg.obj我得到1024字节数组的bacth。

情况下MESSAGE_READ:

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

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

在那之后我也收到这样的警告。在的BufferedOutputStream构造函数中使用

“默认缓冲区大小是否需要8K的缓冲区,将是更好的是明确的。 “

任何帮助,将不胜感激。

感谢

回答

1

应该大致是这样的:

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

我要去这里走出去的肢体,并假设你正在使用的BluetoothChat example从SDK构建的图像发送(所有的例子都符合它)。以下是我扔在一起的快速转换 - 可能不是最好的,但它的工作原理。

由于在BluetoothChatService.java运行函数中它创建了缓冲区数组大小为1024的缓冲区数组,并且从输入流获取信息,因此您可以批量获取它们。如果你创建另一个缓冲区,将适合的图像那里(我设定的最高1MB),那么你运行功能将有:

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

与你在你的imgBuffer其中您的POS变量保持跟踪。

然后你只要复制过来当你在这样的图像的同时(true)循环获取块(mmInStream是一个InputStream):

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

我发送消息,让它知道该图像是完成了发送和在这一点上穿梭imgBuff给其他线程(POS拥有imgBuffer的尺寸在这一点上):

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

我已经定义IMAGE_READ到阵列就像你在做解码您的MESSAGE_READ: