¿Cómo empaquetar contenido Uri con nio.ByteBuffer en Android?
-
21-12-2019 - |
Pregunta
Estoy intentando leer contenido de un Uri en Android y necesito que un nio.ByteBuffer pase el tipo de objeto final al SDK subyacente.
Puedo conseguir un InputStream, a través de ContentResolver, pero no encontré una manera de empaquetarlo con un nio.ByteBuffer.
¿Hay alguna manera de convertir un contenido Uri a nio.ByteBuffer en Android?
Solución
He terminado de descargar el contenido del URI localmente y abrirlo a través de otro método para obtener el bytebuffer
Otros consejos
Supongamos que está trabajando en una actividad,
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:
(i) InputStream.read(byte[] b)
devolverá un número entero que indica el número total de bytes leídos en la matriz de bytes b
en cada momento.
(ii) Si InputStream.read(Byte[] b)
devuelve -1, indica que es el final del inputStream.
(iii) arrSize
almacena el número total de bytes leídos, es decirel largo de byte[] b
(v) ByteBuffer.wrap(byte[] b, int offset, int length)
envolverá la matriz de bytes para proporcionar un ByteBuffer.Puedes comprobar esto referencia
(v) ContentResolver.openInputStream(Uri uri)
y InputStream.read(byte[] b)
lanzará IOException por lo que debes manejarlo.
(vi) Precaución: IndexOutOfBoundException
podría suceder si arrSize
> MAX_SIZE
, es posible que deba agregar una cláusula if-else para manejar dicho problema.
No dude en comentar o cambiar el código si hay algún error o si hay una forma más rápida de hacerlo.Feliz codificación