我正在尝试从 Android 上的 Uri 读取内容,并且我需要通过 nio.ByteBuffer 将最终对象类型传递给底层 SDK。
我可以通过 ContentResolver 获得 InputStream,但没有找到用 nio.ByteBuffer 包装它的方法。
有没有办法在 Android 上将 Uri 内容转换为 nio.ByteBuffer ?
我正在尝试从 Android 上的 Uri 读取内容,并且我需要通过 nio.ByteBuffer 将最终对象类型传递给底层 SDK。
我可以通过 ContentResolver 获得 InputStream,但没有找到用 nio.ByteBuffer 包装它的方法。
有没有办法在 Android 上将 Uri 内容转换为 nio.ByteBuffer ?
我最终在本地下载了 Uri 的内容并通过其他方法打开它以获取 ByteBuffer
假设你正在做一个 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 子句来处理此类问题。
如果有任何错误或有更快的方法,请随时评论或更改代码。快乐编码