擷取檔案資訊

在用戶端應用程式嘗試處理含有內容 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 類別擁有 query() 方法,這個方法會傳回 內容 URI 中與內容 URI 相關聯的檔案名稱和大小 Cursor。預設導入方式會傳回兩個資料欄:

DISPLAY_NAME
檔案名稱,格式為 String。這個值和傳回的值相同 上傳者:File.getName()
SIZE
檔案大小 (以位元組為單位),為 long 這個值與值相同 File.length() 已退回

用戶端應用程式可以透過設定全部選項,取得檔案的 DISPLAY_NAMESIZE 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)));
    ...

如需其他相關資訊,請參閱: