درحال بازیابی اطلاعات فایل

قبل‌از اینکه برنامه کارخواه بخواهد با فایلی که شناسه منبع یکسان محتوا دارد کار کند، برنامه می‌تواند اطلاعات مربوط به فایل را از برنامه سرور درخواست کند، ازجمله نوع داده فایل و اندازه فایل. نوع داده به برنامه کارخواه کمک می‌کند تشخیص دهد که آیا می‌تواند فایل را مدیریت کند یا نه، و اندازه فایل به برنامه کارخواه کمک می‌کند میان‌گیری و ذخیره موقت را برای فایل تنظیم کند.

این درس نشان می‌دهد چگونه FileProvider برنامه سرور را برای بازیابی نوع MIME و اندازه فایل پُرسمان کنید.

بازیابی نوع MIME فایل

نوع داده فایل به برنامه کارخواه نشان می‌دهد که چگونه باید محتوای فایل را مدیریت کند. برای دریافت نوع داده فایل هم‌رسانی‌شده با شناسه منبع یکسان محتوای آن، برنامه کارخواه ContentResolver.getType() را فراخوانی می‌کند. این روش نوع MIME فایل را برمی‌گرداند. به‌طور پیش‌فرض، FileProvider نوع MIME فایل را از پسوند نام فایل تعیین می‌کند.

تکه‌کد زیر نشان می‌دهد که چگونه برنامه کارخواه نوع MIME فایل را پس‌از اینکه برنامه سرور شناسه منبع یکسان محتوا را به کارخواه برگرداند، بازیابی می‌کند:

کاتلین

    ...
    /*
     * 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() است که نام و اندازه فایل مرتبط با شناسه منبع یکسان محتوا را در Cursor برمی‌گرداند. پیاده‌سازی پیش‌فرض دو ستون را برمی‌گرداند:

DISPLAY_NAME
نام فایل، به‌صورت String. این مقدار با مقدار برگردانده‌شده توسط File.getName() یکسان است.
SIZE
اندازه فایل برحسب بایت، به‌عنوان long این مقدار همان مقداری است که توسط File.length() برگردانده شده است

برنامه کارخواه می‌تواند با تنظیم همه آرگومان‌های query() روی null به‌جز شناسه منبع یکسان محتوا، هم DISPLAY_NAME و هم SIZE را برای فایل دریافت کند. برای مثال، این تکه‌کد 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)));
    ...

برای اطلاعات مرتبط بیشتر، به این مقاله مراجعه کنید: