문제

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 절을 ​​추가해야 할 수도 있습니다.

실수가 있거나 더 빠른 방법이 있으면 언제든지 댓글을 달거나 코드를 변경하시기 바랍니다.행복한 코딩

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top