หากต้องการนำเสนอไฟล์จากแอปของคุณไปยังแอปอื่นอย่างปลอดภัย คุณต้องกำหนดค่าแอปให้เสนอแฮนเดิลที่ปลอดภัยสำหรับไฟล์ในรูปแบบ 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
ดูข้อมูลที่เกี่ยวข้องเพิ่มเติมได้ที่