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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top