การตั้งค่าการแชร์ไฟล์

หากต้องการนำเสนอไฟล์จากแอปของคุณไปยังแอปอื่นอย่างปลอดภัย คุณต้องกำหนดค่าแอปให้เสนอแฮนเดิลที่ปลอดภัยสำหรับไฟล์ในรูปแบบ URI ของเนื้อหา คอมโพเนนต์ FileProvider ของ Android จะสร้าง URI เนื้อหาสำหรับไฟล์โดยอิงตามข้อกำหนดที่ระบุไว้ใน XML บทเรียนนี้จะแสดงวิธีเพิ่มการใช้งาน FileProvider เริ่มต้นในแอป และวิธีระบุไฟล์ที่ต้องการเสนอให้แอปอื่นๆ

หมายเหตุ: ชั้นเรียน FileProvider เป็นส่วนหนึ่งของAndroidX Core Library ดูข้อมูลเกี่ยวกับการรวมไลบรารีนี้ไว้ในแอปพลิเคชันได้ที่การประกาศ Dependency

ระบุ FileProvider

การกําหนด FileProvider สําหรับแอปต้องมีรายการในไฟล์ Manifest รายการนี้ระบุสิทธิ์ที่จะใช้ในการสร้าง URI เนื้อหา รวมถึงชื่อไฟล์ XML ที่ระบุไดเรกทอรีที่แอปแชร์ได้

ข้อมูลโค้ดต่อไปนี้แสดงวิธีการเพิ่มองค์ประกอบ <provider> ที่ระบุคลาส FileProvider, สิทธิ์ และชื่อไฟล์ XML ลงในไฟล์ Manifest

<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>

ในตัวอย่างนี้ แอตทริบิวต์ android:authorities ระบุสิทธิ์ URI ที่คุณต้องการใช้สำหรับ URI เนื้อหาที่ FileProvider สร้างขึ้น ในตัวอย่างนี้ สิทธิ์คือ com.example.myapp.fileprovider สำหรับแอปของคุณเอง ให้ระบุสิทธิ์ที่ประกอบด้วยค่า android:package ของแอปโดยใส่สตริง "fileprovider" ต่อท้าย ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าแหล่งที่มาได้ที่หัวข้อ URI ของเนื้อหาและเอกสารประกอบสำหรับแอตทริบิวต์ android:authorities

องค์ประกอบย่อย <meta-data> ของ <provider> จะชี้ไปยังไฟล์ XML ที่ระบุไดเรกทอรีที่ต้องการแชร์ แอตทริบิวต์ android:resource คือเส้นทางและชื่อไฟล์โดยไม่มีนามสกุล .xml เนื้อหาของไฟล์นี้จะอธิบายไว้ในส่วนถัดไป

ระบุไดเรกทอรีที่แชร์ได้

เมื่อเพิ่ม FileProvider ลงในไฟล์ Manifest ของแอปแล้ว คุณจะต้องระบุไดเรกทอรีที่มีไฟล์ที่ต้องการแชร์ หากต้องการระบุไดเรกทอรี ให้เริ่มด้วยการสร้างไฟล์ filepaths.xml ในไดเรกทอรีย่อย res/xml/ ของโปรเจ็กต์ ในไฟล์นี้ ให้ระบุไดเรกทอรีโดยเพิ่มองค์ประกอบ XML สำหรับแต่ละไดเรกทอรี ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่างเนื้อหาของ res/xml/filepaths.xml ตัวอย่างข้อมูลนี้ยังแสดงวิธีแชร์ไดเรกทอรีย่อยของไดเรกทอรี files/ ในพื้นที่เก็บข้อมูลภายในด้วย

<paths>
    <files-path path="images/" name="myimages" />
</paths>

ในตัวอย่างนี้ แท็ก <files-path> จะแชร์ไดเรกทอรีภายในไดเรกทอรี files/ ของที่จัดเก็บข้อมูลภายในของแอป แอตทริบิวต์ path ใช้ไดเรกทอรีย่อย images/ ของ files/ แอตทริบิวต์ name จะบอก FileProvider ให้เพิ่มกลุ่มเส้นทาง myimages ไปยัง URI เนื้อหาของไฟล์ในไดเรกทอรีย่อย files/images/

องค์ประกอบ <paths> มีได้หลายรายการ โดยแต่ละรายการระบุไดเรกทอรีที่แตกต่างกันที่จะแชร์ นอกจากองค์ประกอบ <files-path> แล้ว คุณยังใช้เอลิเมนต์ <external-path> เพื่อแชร์ไดเรกทอรีในที่จัดเก็บข้อมูลภายนอก และเอลิเมนต์ <cache-path> เพื่อแชร์ไดเรกทอรีในไดเรกทอรีของแคชภายในได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับองค์ประกอบย่อยที่ระบุไดเรกทอรีที่แชร์ได้ที่เอกสารอ้างอิง FileProvider

หมายเหตุ: ไฟล์ XML เป็นวิธีเดียวที่คุณระบุไดเรกทอรีที่ต้องการแชร์ได้ คุณจะเพิ่มไดเรกทอรีแบบเป็นโปรแกรมไม่ได้

ตอนนี้คุณมีข้อกำหนดที่สมบูรณ์ของ FileProvider ที่สร้างขึ้น URI เนื้อหาสำหรับไฟล์ในไดเรกทอรี files/ ของพื้นที่เก็บข้อมูลภายในของแอป หรือสำหรับไฟล์ในไดเรกทอรีย่อยของ files/ เมื่อแอปสร้าง URI เนื้อหาสําหรับไฟล์ URI ดังกล่าวจะมีสิทธิ์ที่ระบุไว้ในองค์ประกอบ <provider> (com.example.myapp.fileprovider) เส้นทาง myimages/ และชื่อไฟล์

เช่น หากคุณกำหนด FileProvider ตามตัวอย่างข้อมูลในบทเรียนนี้ และคุณขอ URI เนื้อหาสำหรับไฟล์ default_image.jpg แล้ว FileProvider จะแสดงผล URI ต่อไปนี้

content://com.example.myapp.fileprovider/myimages/default_image.jpg

ดูข้อมูลที่เกี่ยวข้องเพิ่มเติมได้ที่