在客户端应用尝试使用其具有内容 URI 的文件之前,应用可以向服务器应用请求有关该文件的信息,包括该文件的类型和大小。 数据类型帮助客户端应用确定它是否可以处理该文件,文件大小帮助客户端应用为该文件设置缓冲和缓存。
本课程演示了如何查询服务器应用的 FileProvider
以检索文件的 MIME 类型和大小。
检索文件的 MIME 类型
文件的类型指示客户端应用应如何处理文件的内容。 要获取共享文件的类型(假设其内容 URI 已知),客户端应用会调用 ContentResolver.getType()
。 此方法返回文件的 MIME 类型。 默认情况下,FileProvider
会根据其文件名扩展名确定文件的 MIME 类型。
以下代码片段演示了客户端应用如何在服务器应用返回内容 URI 给客户端后检索文件的 MIME 类型
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()
方法的默认实现,该方法会在 Cursor
中返回与内容 URI 关联的文件的名称和大小。 默认实现返回两列
DISPLAY_NAME
- 文件的名称,类型为
String
。 此值与File.getName()
返回的值相同。 SIZE
- 文件大小以字节为单位,表示为
long
。此值与File.length()
返回的值相同。
客户端应用程序可以通过将 query()
的所有参数设置为 null
(除了内容 URI)来获取文件的 DISPLAY_NAME
和 SIZE
。例如,以下代码片段检索文件的 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))); ...
有关更多相关信息,请参阅