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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top