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

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

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

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

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

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

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 باستثناء معرّف الموارد المنتظم (URI) للمحتوى. على سبيل المثال، يسترد مقتطف الرمز هذا الجزء 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)));
    ...

لمزيد من المعلومات ذات الصلة، راجع: