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

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

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

ระบุ FileProvider

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

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

ในตัวอย่างนี้ แอตทริบิวต์ android:authorities ระบุสิทธิ์ URI ที่คุณต้องการใช้สำหรับ URI เนื้อหาที่สร้างโดย FileProvider ในตัวอย่างนี้ สิทธิ์คือ com.example.myapp.fileprovider เพื่อการใช้งานของคุณเอง ให้ระบุสิทธิ์ที่ประกอบด้วย ค่า android:package ที่มีสตริง "fileprovider" ต่อท้าย เพื่อดูข้อมูลเพิ่มเติม เกี่ยวกับค่าอำนาจหน้าที่ โปรดดูหัวข้อ URL เนื้อหา และเอกสารประกอบสำหรับ 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 เนื้อหาสำหรับไฟล์ มีการระบุสิทธิ์ที่ระบุใน องค์ประกอบ <provider> (com.example.myapp.fileprovider) เส้นทาง myimages/ และชื่อไฟล์

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

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

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