Để 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 thiết lập ứng dụng để cung cấp
một xử lý bảo mật cho tệp, dưới dạng URI nội dung. Hệ điều hành Android
Thành phần FileProvider tạo URI nội dung cho
dựa trên thông số kỹ thuật bạn cung cấp trong XML. Bài học này sẽ hướng dẫn bạn cách thêm
cách triển khai FileProvider cho ứng dụng của bạn và cách
chỉ định tệp 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ề việc đưa thư viện này vào ứng dụng của bạn, hãy xem
Khai báo phần phụ thuộc.
Chỉ định FileProvider
Để xác định FileProvider cho ứng dụng, bạn phải nhập một mục trong
tệp kê khai của bạn. 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 hướng dẫn bạn cách thêm vào tệp kê khai
Phần tử <provider> chỉ định
lớp FileProvider, thẩm quyền và lớp
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 đơn vị quản lý URI
mà bạn muốn sử dụng cho các URI nội dung được tạo bởi
FileProvider
Trong ví dụ này, đơn vị quản lý là com.example.myapp.fileprovider. Dành cho bạn
hãy chỉ định một đơn vị quản lý bao gồm
Giá trị android:package có chuỗi "fileprovider" được thêm vào từ khoá. Để 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 cho phần
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 res/xml/
thư mục con của dự án. Trong tệp này, hãy chỉ định các thư mục bằng cách thêm phần tử XML cho
từng thư mục. Đoạn mã sau đây cho bạn xem 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ẻ thư mục con
của thư mục files/ vào 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 phần tử
Thư mục files/ của bộ nhớ trong của ứng dụng. Thuộc tính path
dùng chung thư mục con images/ của files/. name
yêu cầu FileProvider thêm đ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, trong đó mỗi phần tử chỉ định một
thư mục cần 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ẻ các thư mục trong bộ nhớ đệm nội bộ
thư mục. Để 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 mà bạn muốn chia sẻ; bạn không thể lập trình để thêm thư mục.
Bạn hiện đã có bản đặc tả hoàn chỉnh của FileProvider
để tạo URI nội dung cho các tệp trong thư mục files/ của ứng dụng
bộ nhớ trong 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, tệp này chứa quyền được chỉ định trong
<provider> phần tử (com.example.myapp.fileprovider),
đường dẫn myimages/ và tên tệp.
Ví dụ: nếu bạn xác định FileProvider theo
trong bài học này và bạn yêu cầu URI nội dung cho tệp
default_image.jpg, FileProvider trả về giá trị
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: