Как обернуть содержимое 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 для решения такой проблемы.

Пожалуйста, не стесняйтесь комментировать или изменять код, если есть какая-либо ошибка или если есть более быстрый способ сделать это. Удачного кодирования

Другие вопросы по тегам