Thiết lập tính năng chia sẻ tệp

Để 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: