检索文件信息

在客户端应用尝试处理其具有内容 URI 的文件之前,该应用可以从服务器应用请求有关该文件的信息,包括文件的数据类型和文件大小。数据类型帮助客户端应用确定它是否可以处理该文件,而文件大小帮助客户端应用为该文件设置缓冲和缓存。

本课程演示如何查询服务器应用的 FileProvider 以检索文件的文件类型和大小。

检索文件的文件类型

文件的数据类型指示客户端应用如何处理文件的内容。要获取给定其内容 URI 的共享文件的数据类型,客户端应用会调用 ContentResolver.getType()。此方法返回文件的文件类型。默认情况下,FileProvider 从其文件名扩展名确定文件的文件类型。

以下代码片段演示了客户端应用如何在服务器应用将内容 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() 方法的默认实现,该方法在 Cursor 中返回与内容 URI 关联的文件的名称和大小。默认实现返回两列

DISPLAY_NAME
文件名称,作为 String。此值与 File.getName() 返回的值相同。
SIZE
文件大小(以字节为单位),作为 long。此值与 File.length() 返回的值相同。

客户端应用程序可以通过将query()的所有参数(除了内容 URI 外)都设置为null来获取文件的DISPLAY_NAMESIZE。例如,以下代码片段检索文件的DISPLAY_NAMESIZE,并在单独的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)));
    ...

有关其他相关信息,请参阅