كيفية تغليف محتوى Uri باستخدام nio.ByteBuffer على Android؟
-
21-12-2019 - |
سؤال
أحاول قراءة المحتوى من 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 للتعامل مع هذه المشكلة.
لا تتردد في التعليق أو تغيير الرمز إذا كان هناك أي خطأ أو إذا كانت هناك طريقة أسرع للقيام بذلك.ترميز سعيد