מתבצע אחזור של פרטי הקובץ

לפני שאפליקציית לקוח מנסה לעבוד עם קובץ שעבורו יש לה URI של תוכן, האפליקציה יכולה לבקש מידע על הקובץ מאפליקציית השרת, כולל סוג הנתונים של הקובץ גודל הקובץ. סוג הנתונים עוזר לאפליקציית הלקוח לקבוע אם היא יכולה לטפל בקובץ. גודל הקובץ עוזר לאפליקציית הלקוח להגדיר את הקובץ בתהליך אגירת נתונים ושמירה במטמון.

השיעור הזה מדגים איך להריץ שאילתות על אפליקציית השרת 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 יש הטמעת ברירת מחדל של ה-method 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)));
    ...

מידע נוסף בנושא זמין במאמרים הבאים: