2011-05-14 6 views
1

Я пытаюсь перенести изображение с ПК на андроид, используя соединение сокета. Я могу получить данные с ПК на телефон, но когда я передаю byte[] в BitmapFactory, он возвращает null. Также когда-то он возвращает изображение, но не всегда.Android - BitmapFactory.decodeByteArray возвращает null

Размер изображения 40054 bytes. Я получаю 2048 bytes за один раз, создавая небольшой пул данных (буфер), который содержит данные byte. Получив полные данные, я передаю его BitmapFactory. Вот мой код:

byte[] buffer = new byte[40054]; 
byte[] temp2kBuffer = new byte[2048]; 
int buffCounter = 0; 
for(buffCounter = 0; buffCounter < 19; buffCounter++) 
{ 
    inp.read(temp2kBuffer,0,2048); // this is the input stream of socket 
    for(int j = 0; j < 2048; j++) 
    { 
     buffer[(buffCounter*2048)+j] = temp2kBuffer[j]; 
    } 
} 
byte[] lastPacket=new byte[1142]; 
inp.read(lastPacket,0,1142); 
buffCounter = buffCounter-1; 
for(int j = 0; j < 1142; j++) 
{ 
    buffer[(buffCounter*2048)+j] = lastPacket[j]; 
} 
bmp=BitmapFactory.decodeByteArray(buffer,0,dataLength); // here bmp is null 

Расчеты

[19 data buffers of 2kb each] 19 X 2048 = 38912 bytes 
[Last data buffer] 1142 bytes 
38912 + 1142 = 40054 bytes [size of image] 

Я также пытался прочитать полные 40054 байт в то время, но это тоже не работал. Вот код:

inp.read(buffer,0,40054); 
bmp=BitmapFactory.decodeByteArray(buffer,0,dataLength); // here bmp is null 

Кроме того, на последней проверки с decodeStream, но результат был тот же.

Любая идея, где я делаю неправильно?

Благодаря

ответ

3

Я не знаю, если это поможет в вашем случае, но в целом вы не должны полагаться на InputStream.read (байт [], Int, Int), чтобы прочитать точное количество байтов вы спрашиваете для. Это максимальное значение. Если вы проверите документацию InputStream.read, вы увидите, что она возвращает фактическое количество прочитанных байтов, которые вы должны учитывать.

Обычно при загрузке всех данных из InputStream и ожидании их закрытия, как только все данные будут прочитаны, я делаю что-то вроде этого.

ByteArrayOutputStream dataBuffer = new ByteArrayOutputStream(); 
int readLength; 
byte buffer[] = new byte[1024]; 
while ((readLength = is.read(buffer)) != -1) { 
    dataBuffer.write(buffer, 0, readLength); 
} 
byte[] data = dataBuffer.toByteArray(); 

И если вам нужно загрузить только определенное количество данных, то вы знаете размер заранее.

byte[] data = new byte[SIZE]; 
int readTotal = 0; 
int readLength = 0; 
while (readLength >= 0 && readTotal < SIZE) { 
    readLength = is.read(data, readTotal, SIZE - readTotal); 
    if (readLength > 0) { 
     readTotal += readLength; 
    } 
} 
+0

выглядит полезным ... позвольте мне проверить его ... Спасибо! –