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 đị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: