0

我正在尝试从 Android 上的 Uri 读取内容,并且我需要通过 nio.ByteBuffer 将最终对象类型传递给底层 SDK。

我可以通过 ContentResolver 获得 InputStream,但没有找到用 nio.ByteBuffer 包装它的方法。

有没有办法在 Android 上将 Uri 内容转换为 nio.ByteBuffer ?

4

2 回答 2

0

我最终在本地下载了 Uri 的内容并通过其他方法打开它以获取 ByteBuffer

于 2014-12-24T13:51:37.800 回答
0

假设你正在做一个 Activity,

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;
}

笔记:

(i)将返回一个整数,表示每次InputStream.read(byte[] b)读入字节数组的字节总数。b

(ii) 如果InputStream.read(Byte[] b)返回-1,表示输入流结束。

(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 子句来处理此类问题。

如果有任何错误或有更快的方法,请随时评论或更改代码。快乐编码

于 2018-09-20T12:30:23.910 回答