在用戶端應用程式嘗試處理含有內容 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_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))); ...
如需其他相關資訊,請參閱: