Я пытаюсь перенести изображение с ПК на андроид, используя соединение сокета. Я могу получить данные с ПК на телефон, но когда я передаю byte[]
в BitmapFactory
, он возвращает 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
, но результат был таким же.
Любая идея, где я делаю неправильно?
Спасибо
Я не знаю, поможет ли это в вашем случае, но в целом вы не должны полагаться на InputStream.read(byte [], 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;
}
}