جارٍ استرداد معلومات الملف

قبل أن يحاول تطبيق العميل العمل مع ملف يحتوي على معرّف موارد منتظم للمحتوى الخاص به، يمكن للتطبيق طلب معلومات عن الملف من تطبيق الخادم، بما في ذلك نوع بيانات الملف وحجم الملف. يساعد نوع البيانات تطبيق العميل في تحديد ما إذا كان يمكنه معالجة الملف، ويساعد حجم الملف التطبيق العميل في إعداد التخزين المؤقت والتخزين المؤقت للملف.

يوضّح هذا الدرس كيفية إجراء طلب بحث عن FileProvider في تطبيق الخادم لاسترداد نوع MIME لملف وحجمه.

استرداد نوع MIME لملف

يوضح نوع بيانات الملف لتطبيق العميل كيفية تعامله مع محتوى الملف. للحصول على نوع البيانات لملف مشترك حسب معرّف الموارد المنتظم للمحتوى الخاص به، يطلب تطبيق العميل ContentResolver.getType(). وتعرض هذه الطريقة نوع MIME للملف. يحدّد FileProvider تلقائيًا نوع MIME للملف من امتداد اسم الملف.

يوضِّح مقتطف الرمز التالي كيفية استرداد تطبيق عميل لنوع MIME لملف بعد أن يعرض تطبيق الخادم معرّف الموارد المنتظم للمحتوى إلى العميل:

Kotlin

    ...
    /*
     * 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)
    }
    ...

Java

    ...
    /*
     * 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 باستثناء معرّف الموارد المنتظم للمحتوى. على سبيل المثال، يسترد مقتطف الرمز هذا الترميز DISPLAY_NAME وSIZE للملف ويعرض كل عنصر في TextView منفصل:

Kotlin

    /*
     * 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()
        ...
    }

Java

    ...
    /*
     * 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)));
    ...

للحصول على معلومات إضافية ذات صلة، راجع: