Como agrupar o conteúdo do Uri com um nio.ByteBuffer no Android?
-
21-12-2019 - |
Pergunta
Estou tentando ler o conteúdo de um Uri no Android e preciso que o tipo de objeto final seja passado ao SDK subjacente por um nio.ByteBuffer.
Posso obter um InputStream via ContentResolver, mas não encontrei uma maneira de envolvê-lo com um nio.ByteBuffer.
Existe uma maneira de converter um conteúdo Uri em um nio.ByteBuffer no Android?
Solução
Eu acabei baixando o conteúdo do URI localmente e abri-lo por outro método para obter o bytebuffer
Outras dicas
Suponha que você esteja trabalhando em uma atividade,
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;
}
Notas:
(eu) InputStream.read(byte[] b)
retornará um número inteiro que indica o número total de bytes lidos na matriz de bytes b
em cada momento.
(ii) Se InputStream.read(Byte[] b)
retorna -1, indica que é o fim do inputStream.
(iii) arrSize
armazena o número total de bytes lidos, ou seja,o comprimento do byte[] b
(4) ByteBuffer.wrap(byte[] b, int offset, int length)
envolverá a matriz de bytes para fornecer um ByteBuffer.Você pode verificar isso referência
(v) ContentResolver.openInputStream(Uri uri)
e InputStream.read(byte[] b)
lançará IOException então você deve lidar com isso.
(vi) Cuidado: IndexOutOfBoundException
pode acontecer se arrSize
> MAX_SIZE
, pode ser necessário adicionar a cláusula if-else para lidar com esse problema.
Fique à vontade para comentar ou alterar o código se houver algum erro ou se houver uma maneira mais rápida de fazer isso.Boa codificação