سؤال

أحاول قراءة المحتوى من Uri على Android، وأحتاج إلى تمرير نوع الكائن النهائي إلى SDK الأساسي بواسطة nio.ByteBuffer.

يمكنني الحصول على InputStream، عبر ContentResolver ولكن لم أجد طريقة لتغليفه باستخدام nio.ByteBuffer.

هل هناك طريقة لتحويل محتوى Uri إلى nio.ByteBuffer على Android؟

هل كانت مفيدة؟

المحلول

لقد انتهى الأمر بتنزيل محتوى 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 في كل مرة.

(الثاني) إذا InputStream.read(Byte[] b) بإرجاع -1، فإنه يشير إلى أنها نهاية inputStream.

(ثالثًا) arrSize يخزن العدد الإجمالي للبايتات المقروءة، أي.طول byte[] b

(رابعا) ByteBuffer.wrap(byte[] b, int offset, int length) سوف يلتف مصفوفة البايت لإعطاء ByteBuffer.يمكنك التحقق من هذا مرجع

(الخامس) ContentResolver.openInputStream(Uri uri) و InputStream.read(byte[] b) سوف يرمي IOException لذا يجب عليك التعامل معه.

(السادس) الحذر: IndexOutOfBoundException قد يحدث إذا arrSize > MAX_SIZE, ، قد تحتاج إلى إضافة عبارة if-else للتعامل مع هذه المشكلة.

لا تتردد في التعليق أو تغيير الرمز إذا كان هناك أي خطأ أو إذا كانت هناك طريقة أسرع للقيام بذلك.ترميز سعيد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top