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

Để cung cấp tệp từ ứng dụng của bạn sang 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 để cung cấp một đối tượng xử lý bảo mật cho tệp, dưới 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 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 cũng như cách chỉ định những tệp bạn muốn cung cấp cho các ứng dụng khác.

Lưu ý: Lớp FileProvider thuộc 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 nhập này chỉ định thẩm quyền sử dụng trong việc 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 đơn vị 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, đơn vị quản lý 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ý có chứa giá trị android:package của ứng dụng đó với chuỗi "fileprovider" được thêm vào đó. Để tìm hiểu thêm về giá trị của 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 mà không có đuôi .xml.Nội dung của tệp này sẽ được mô tả trong phần tiếp theo.

Chỉ định các 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 một 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 khu vực bộ nhớ trong của bạn:

<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 dùng chung 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 các URI nội dung của 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ử chỉ định một thư mục riêng để 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 chỉ định các thư mục mà 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.

Bây giờ, bạn đã có thông số kỹ thuật đầy đủ của một 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, tệp đó 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: