Để cung cấp một tệp từ ứng dụng của bạn cho một ứng dụng khác một cách an toàn, bạn cần định cấu hình ứng dụng của mình để cung cấp một tên xử lý an toàn cho tệp đó, ở dạng URI nội dung. Thành phần FileProvider
của Android tạo URI nội dung cho các tệp, dựa trên thông số kỹ thuật mà bạn cung cấp trong XML. Bài học này sẽ hướng dẫn bạn cách thêm phương thức triển khai mặc định của FileProvider
vào ứng dụng và cách chỉ định các tệp mà bạn muốn cung cấp cho các ứng dụng khác.
Lưu ý: Lớp FileProvider
là một phần của Thư viện AndroidX Core. Để biết thông tin về cách đưa thư viện này vào ứng dụng của bạn, hãy xem phần Khai báo phần phụ thuộc.
Chỉ định FileProvider
Để xác định FileProvider
cho ứng dụng, bạn cần có một mục trong tệp kê khai. Mục này chỉ định quyền sử dụng để tạo URI nội dung, cũng như tên của tệp XML chỉ định các thư mục mà ứng dụng của bạn có thể chia sẻ.
Đoạn mã sau đây cho bạn biết cách thêm vào tệp kê khai phần tử <provider>
chỉ định lớp FileProvider
, đơn vị quản lý và tên tệp XML:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application ...> <provider android:name="androidx.core.content.FileProvider" android:authorities="com.example.myapp.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider> ... </application> </manifest>
Trong ví dụ này, thuộc tính android:authorities
chỉ định cơ quan quản lý URI mà bạn muốn sử dụng cho các URI nội dung do FileProvider
tạo.
Trong ví dụ này, quyền là com.example.myapp.fileprovider
. Đối với ứng dụng của riêng bạn, hãy chỉ định một đơn vị quản lý bao gồm giá trị android:package
của ứng dụng có chuỗi "fileprovider" được thêm vào đó. Để tìm hiểu thêm về giá trị uỷ quyền, hãy xem chủ đề URI nội dung và tài liệu về thuộc tính android:authorities
.
Phần tử con <meta-data>
của <provider>
trỏ đến một tệp XML chỉ định các thư mục mà bạn muốn chia sẻ. Thuộc tính android:resource
là đường dẫn và tên của tệp, không có đuôi .xml
. Nội dung của tệp này được mô tả trong phần tiếp theo.
Chỉ định thư mục có thể chia sẻ
Sau khi thêm FileProvider
vào tệp kê khai ứng dụng, bạn cần chỉ định các thư mục chứa tệp bạn muốn chia sẻ. Để chỉ định các thư mục, hãy bắt đầu bằng cách tạo tệp filepaths.xml
trong thư mục con res/xml/
của dự án. Trong tệp này, hãy chỉ định các thư mục bằng cách thêm một phần tử XML cho mỗi thư mục. Đoạn mã sau đây cho bạn thấy ví dụ về nội dung của res/xml/filepaths.xml
. Đoạn mã này cũng minh hoạ cách chia sẻ một thư mục con của thư mục files/
trong bộ nhớ trong:
<paths> <files-path path="images/" name="myimages" /> </paths>
Trong ví dụ này, thẻ <files-path>
chia sẻ các thư mục trong thư mục files/
của bộ nhớ trong của ứng dụng. Thuộc tính path
chia sẻ thư mục con images/
của files/
. Thuộc tính name
yêu cầu FileProvider
thêm phân đoạn đường dẫn myimages
vào URI nội dung cho các tệp trong thư mục con files/images/
.
Phần tử <paths>
có thể có nhiều phần tử con, mỗi phần tử con chỉ định một thư mục khác nhau để chia sẻ. Ngoài phần tử <files-path>
, bạn có thể sử dụng phần tử <external-path>
để chia sẻ thư mục trong bộ nhớ ngoài và phần tử <cache-path>
để chia sẻ thư mục trong thư mục bộ nhớ đệm nội bộ. Để tìm hiểu thêm về các phần tử con chỉ định thư mục dùng chung, hãy xem tài liệu tham khảo về FileProvider
.
Lưu ý: Tệp XML là cách duy nhất để bạn có thể chỉ định các thư mục bạn muốn chia sẻ; bạn không thể thêm thư mục theo phương thức lập trình.
Giờ đây, bạn đã có thông số kỹ thuật đầy đủ của FileProvider
tạo URI nội dung cho các tệp trong thư mục files/
của bộ nhớ trong của ứng dụng hoặc cho các tệp trong thư mục con của files/
. Khi ứng dụng của bạn tạo URI nội dung cho một tệp, ứng dụng đó sẽ chứa quyền được chỉ định trong phần tử <provider>
(com.example.myapp.fileprovider
), đường dẫn myimages/
và tên tệp.
Ví dụ: nếu bạn xác định FileProvider
theo các đoạn mã trong bài học này và yêu cầu URI nội dung cho tệp default_image.jpg
, thì FileProvider
sẽ trả về URI sau:
content://com.example.myapp.fileprovider/myimages/default_image.jpg
Để biết thêm thông tin liên quan, hãy tham khảo: