Как обернуть содержимое Uri с помощью nio.ByteBuffer на Android?
Я пытаюсь прочитать содержимое из Uri на Android, и мне нужен окончательный тип объекта, передаваемый в базовый SDK с помощью nio.ByteBuffer.
Я могу получить InputStream через ContentResolver, но не нашел способа обернуть его с помощью nio.ByteBuffer.
Есть ли способ конвертировать контент Uri в nio.ByteBuffer на Android?
2 ответа
В итоге я скачал содержимое Uri локально и открыл его другим способом, чтобы получить ByteBuffer
Предположим, вы работаете над деятельностью,
private ByteBuffer getByteBuffer(Uri uri){
try{
InputStream iStream = getContentResolver().openInputStream(uri);
if(iStream!=null){
//value of MAX_SIZE is up to your requirement
final int MAX_SIZE = 5000000;
byte[] byteArr = new byte[MAX_SIZE];
int arrSize = 0;
while(true){
int value = iStream.read(byteArr);
if(value == -1){
break;
}else{
arrSize += value;
}
}
iStream.close();
return ByteBuffer.wrap(byteArr, 0, arrSize);
}
}catch(IOException e){
//do something
}
return null;
}
Заметки:
(я) InputStream.read(byte[] b)
вернет целое число, которое указывает общее количество байтов, прочитанных в байтовый массив b
в каждый раз.
(ii) Если InputStream.read(Byte[] b)
возвращает -1, это указывает, что это конец inputStream.
(III) arrSize
хранит общее количество прочитанных байтов, то есть длину byte[] b
(IV) ByteBuffer.wrap(byte[] b, int offset, int length)
обернет массив байтов, чтобы получить ByteBuffer. Вы можете проверить эту ссылку
(V) ContentResolver.openInputStream(Uri uri)
а также InputStream.read(byte[] b)
вызовет IOException, поэтому вы должны справиться с этим.
(vi) Осторожно: IndexOutOfBoundException
может случиться, если arrSize
> MAX_SIZE
Вам может понадобиться добавить условие if-else для решения такой проблемы.
Пожалуйста, не стесняйтесь комментировать или изменять код, если есть какая-либо ошибка или если есть более быстрый способ сделать это. Удачного кодирования