检索文件信息

在客户端应用尝试使用其具有内容 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_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)));
    ...

有关更多相关信息,请参阅