質問

AndroidのURIからコンテンツを読み込もうとしています。

ContentResolverを介して、InputStreamに手を差し伸べることができますが、Nio.ByteBufferでそれをラップする方法は見つかりませんでした。

URIコンテンツをAndroidの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;
}
.

注:

(i)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