قبل از اینکه یک برنامه مشتری سعی کند با فایلی کار کند که دارای URI محتوایی برای آن است، برنامه میتواند اطلاعات مربوط به فایل را از برنامه سرور درخواست کند، از جمله نوع داده فایل و اندازه فایل. نوع داده به برنامه مشتری کمک میکند تا تشخیص دهد که آیا میتواند فایل را مدیریت کند یا خیر، و اندازه فایل به برنامه مشتری کمک میکند تا بافر و ذخیرهسازی فایل را تنظیم کند.
این درس نشان می دهد که چگونه می توان از FileProvider
برنامه سرور برای بازیابی نوع و اندازه MIME یک فایل پرس و جو کرد.
نوع MIME یک فایل را بازیابی کنید
نوع داده یک فایل به برنامه مشتری نشان می دهد که چگونه باید محتویات فایل را مدیریت کند. برای دریافت نوع داده یک فایل مشترک با توجه به URI محتوای آن، برنامه مشتری ContentResolver.getType()
فراخوانی می کند. این روش نوع MIME فایل را برمی گرداند. به طور پیش فرض، یک FileProvider
نوع MIME فایل را از پسوند نام فایل خود تعیین می کند.
قطعه کد زیر نشان می دهد که چگونه یک برنامه مشتری نوع MIME یک فایل را پس از اینکه برنامه سرور URI محتوا را به مشتری برگرداند، بازیابی می کند:
کاتلین
... /* * Get the file's content URI from the incoming Intent, then * get the file's MIME type */ val mimeType: String? = returnIntent.data?.let { returnUri -> contentResolver.getType(returnUri) } ...
جاوا
... /* * Get the file's content URI from the incoming Intent, then * get the file's MIME type */ Uri returnUri = returnIntent.getData(); String mimeType = getContentResolver().getType(returnUri); ...
نام و اندازه یک فایل را بازیابی کنید
کلاس FileProvider
یک پیادهسازی پیشفرض از متد query()
دارد که نام و اندازه فایل مرتبط با URI محتوا را در Cursor
برمیگرداند. اجرای پیش فرض دو ستون را برمی گرداند:
-
DISPLAY_NAME
- نام فایل، به عنوان یک
String
. این مقدار همان مقداری است که توسطFile.getName()
بازگردانده شده است. -
SIZE
- اندازه فایل بر حسب بایت، به صورت
long
این مقدار همان مقداری است که توسطFile.length()
برگردانده شده است.
برنامه کلاینت میتواند هم DISPLAY_NAME
و هم SIZE
برای یک فایل با تنظیم همه آرگومانهای query()
روی null
به جز URI محتوا دریافت کند. به عنوان مثال، این قطعه کد DISPLAY_NAME
و SIZE
یک فایل را بازیابی می کند و هر کدام را در TextView
جداگانه نمایش می دهد:
کاتلین
/* * Get the file's content URI from the incoming Intent, * then query the server app to get the file's display name * and size. */ returnIntent.data?.let { returnUri -> contentResolver.query(returnUri, null, null, null, null) }?.use { cursor -> /* * Get the column indexes of the data in the Cursor, * move to the first row in the Cursor, get the data, * and display it. */ val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE) cursor.moveToFirst() findViewById<TextView>(R.id.filename_text).text = cursor.getString(nameIndex) findViewById<TextView>(R.id.filesize_text).text = cursor.getLong(sizeIndex).toString() ... }
جاوا
... /* * Get the file's content URI from the incoming Intent, * then query the server app to get the file's display name * and size. */ Uri returnUri = returnIntent.getData(); Cursor returnCursor = getContentResolver().query(returnUri, null, null, null, null); /* * Get the column indexes of the data in the Cursor, * move to the first row in the Cursor, get the data, * and display it. */ int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE); returnCursor.moveToFirst(); TextView nameView = (TextView) findViewById(R.id.filename_text); TextView sizeView = (TextView) findViewById(R.id.filesize_text); nameView.setText(returnCursor.getString(nameIndex)); sizeView.setText(Long.toString(returnCursor.getLong(sizeIndex))); ...
برای اطلاعات بیشتر مرتبط به این موضوع مراجعه کنید: