Android에서 Uri 콘텐츠를 nio.ByteBuffer로 래핑하는 방법은 무엇입니까?
-
21-12-2019 - |
문제
Android의 Uri에서 콘텐츠를 읽으려고 하는데 nio.ByteBuffer를 통해 기본 SDK에 전달되는 최종 개체 유형이 필요합니다.
ContentResolver를 통해 InputStream을 사용할 수 있지만 nio.ByteBuffer로 래핑하는 방법을 찾지 못했습니다.
Android에서 Uri 콘텐츠를 nio.ByteBuffer로 변환하는 방법이 있나요?
해결책
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 절을 추가해야 할 수도 있습니다.
실수가 있거나 더 빠른 방법이 있으면 언제든지 댓글을 달거나 코드를 변경하시기 바랍니다.행복한 코딩