检索文件信息

如果客户端应用拥有某个文件的内容 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)));
        ...
    

如需了解其他相关信息,请参阅: