检索文件信息

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

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

检索文件的 MIME 类型

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

以下代码段演示了客户端应用如何检索文件的 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 中关联的文件的名称和大小 Cursor。默认实现返回两列:

DISPLAY_NAME
文件名,格式为 String。此值与返回的值相同 上传者:File.getName()
SIZE
文件大小(以字节为单位),格式为 long。此值与 由File.length()退回

客户端应用可以通过设置所有值来获取文件的 DISPLAY_NAMESIZEquery() 的参数设置为 null(内容 URI 除外)。例如,以下代码段用于检索文件的 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)));
    ...

要了解更多相关信息,请参阅: