Truy xuất thông tin tệp

Trước khi một ứng dụng khách cố làm việc với một tệp có URI nội dung, ứng dụng đó có thể yêu cầu thông tin về tệp từ ứng dụng máy chủ, bao gồm cả loại dữ liệu của tệp và kích thước tệp. Loại dữ liệu giúp ứng dụng khách xác định xem ứng dụng có thể xử lý tệp hay không và kích thước tệp giúp ứng dụng khách thiết lập việc lưu vào bộ đệm và bộ nhớ đệm cho tệp.

Bài học này minh hoạ cách truy vấn ứng dụng máy chủ FileProvider để truy xuất loại và kích thước MIME của tệp.

Truy xuất loại MIME của tệp

Loại dữ liệu của tệp cho ứng dụng khách biết cách xử lý nội dung của tệp. Để tải loại dữ liệu của một tệp dùng chung dựa trên URI nội dung của tệp đó, ứng dụng khách sẽ gọi ContentResolver.getType(). Phương thức này trả về loại MIME của tệp. Theo mặc định, FileProvider xác định loại MIME của tệp từ đuôi tệp.

Đoạn mã sau đây minh hoạ cách một ứng dụng khách truy xuất loại MIME của tệp một lần ứng dụng máy chủ đã trả về URI nội dung cho ứng dụng:

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);
    ...

Truy xuất tên và kích thước của tệp

Lớp FileProvider có cách triển khai mặc định là Phương thức query() trả về tên và kích thước của tệp được liên kết với URI nội dung trong một Cursor. Cách triển khai mặc định trả về 2 cột:

DISPLAY_NAME
Tên của tệp, dưới dạng String. Giá trị này giống với giá trị được trả về của File.getName().
SIZE
Kích thước của tệp tính bằng byte, là long Giá trị này giống với giá trị được trả về bởi File.length()

Ứng dụng khách có thể nhận cả DISPLAY_NAMESIZE cho một tệp bằng cách đặt tất cả các đối số của query() đến null ngoại trừ URI nội dung. Ví dụ: đoạn mã này truy xuất các phiên bản DISPLAY_NAMESIZE và hiển thị từng mã riêng biệt 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)));
    ...

Để biết thêm thông tin liên quan, hãy tham khảo: