بازیابی اطلاعات فایل

قبل از اینکه یک برنامه مشتری سعی کند با فایلی کار کند که دارای 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)));
    ...

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