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ủaFile.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ởiFile.length()
Ứng dụng khách có thể nhận cả DISPLAY_NAME
và SIZE
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_NAME
và
SIZE
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: