Android 4.4 (API ระดับ 19) เปิดตัว Storage Access Framework (SAF) SAF จะช่วยให้ผู้ใช้เลือกดูและเปิดเอกสาร รูปภาพ และไฟล์อื่นๆ ผ่านผู้ให้บริการพื้นที่เก็บเอกสารที่ต้องการทั้งหมดได้ UI มาตรฐานที่ใช้งานง่ายช่วยให้ผู้ใช้เรียกดูไฟล์และเข้าถึงไฟล์ล่าสุดในลักษณะที่สอดคล้องกันในแอปและผู้ให้บริการต่างๆ
บริการพื้นที่เก็บข้อมูลระบบคลาวด์หรือในเครื่องสามารถเข้าร่วมระบบนิเวศนี้ได้โดยใช้ DocumentsProvider
ที่รวมบริการของตน แอปไคลเอ็นต์ที่ต้องการเข้าถึงเอกสารของผู้ให้บริการสามารถผสานรวมกับ SAF ได้ด้วยโค้ดไม่กี่บรรทัด
SAF ประกอบด้วยสิ่งต่อไปนี้
- ผู้ให้บริการเอกสาร: ผู้ให้บริการเนื้อหาที่อนุญาตให้บริการจัดเก็บข้อมูล เช่น Google ไดรฟ์ แสดงไฟล์ที่จัดการ ผู้ให้บริการเอกสารมีการใช้งานเป็นคลาสย่อยของคลาส
DocumentsProvider
สคีมาของผู้ให้บริการเอกสารจะอิงตามลําดับชั้นไฟล์แบบดั้งเดิม แม้ว่าคุณจะจัดเก็บข้อมูลของผู้ให้บริการเอกสารอย่างไรก็ได้ แพลตฟอร์ม Android มีผู้ให้บริการเอกสารในตัวหลายราย เช่น การดาวน์โหลด รูปภาพ และวิดีโอ - แอปไคลเอ็นต์: แอปที่กําหนดเองซึ่งเรียกใช้การดำเนินการตามเจตนา
ACTION_CREATE_DOCUMENT
,ACTION_OPEN_DOCUMENT
และACTION_OPEN_DOCUMENT_TREE
และรับไฟล์ที่ผู้ให้บริการเอกสารแสดงผล - เครื่องมือเลือก: UI ของระบบที่ช่วยให้ผู้ใช้เข้าถึงเอกสารจากผู้ให้บริการเอกสารทั้งหมดที่ตรงกับเกณฑ์การค้นหาของแอปไคลเอ็นต์
SAF มีฟีเจอร์ต่อไปนี้
- ช่วยให้ผู้ใช้เรียกดูเนื้อหาจากผู้ให้บริการเอกสารทั้งหมด ไม่ใช่แค่แอปเดียว
- ช่วยให้แอปของคุณมีสิทธิ์เข้าถึงเอกสารที่ผู้ให้บริการเอกสารเป็นเจ้าของได้อย่างต่อเนื่องในระยะยาว สิทธิ์เข้าถึงนี้ช่วยให้ผู้ใช้เพิ่ม แก้ไข บันทึก และลบไฟล์ในผู้ให้บริการได้
- รองรับบัญชีผู้ใช้หลายบัญชีและรูทชั่วคราว เช่น ผู้ให้บริการพื้นที่เก็บข้อมูล USB ซึ่งจะปรากฏขึ้นก็ต่อเมื่อเสียบไดรฟ์เท่านั้น
ภาพรวม
SAF จะมุ่งเน้นที่ผู้ให้บริการเนื้อหาที่เป็นคลาสย่อยของคลาส DocumentsProvider
ภายในผู้ให้บริการเอกสาร ข้อมูลจะจัดโครงสร้างเป็นลําดับชั้นไฟล์แบบดั้งเดิม ดังนี้
รูปที่ 1 โมเดลข้อมูลของผู้ให้บริการเอกสาร รูทจะชี้ไปยังเอกสารเดียว จากนั้นจึงเริ่มการแยกสาขาของต้นไม้
ข้อควรทราบ
- ผู้ให้บริการเอกสารแต่ละรายจะรายงานรูทอย่างน้อย 1 รายการ ซึ่งเป็นจุดเริ่มต้นในการสำรวจลําดับชั้นของเอกสาร
รูทแต่ละรายการจะมี
COLUMN_ROOT_ID
ที่ไม่ซ้ำกัน และชี้ไปยังเอกสาร (ไดเรกทอรี) ที่แสดงถึงเนื้อหาที่อยู่ภายใต้รูทนั้น รูทเป็นแบบไดนามิกโดยการออกแบบเพื่อรองรับกรณีการใช้งาน เช่น บัญชีหลายบัญชี อุปกรณ์เก็บข้อมูล USB ชั่วคราว หรือการเข้าสู่ระบบและออกจากระบบของผู้ใช้ - ภายใต้รูทแต่ละรายการจะมีเอกสารเดียว เอกสารดังกล่าวชี้ไปยังเอกสาร 1 ถึง N รายการ ซึ่งแต่ละรายการจะชี้ไปยังเอกสาร 1 ถึง N รายการ
- แบ็กเอนด์ของพื้นที่เก็บข้อมูลแต่ละแห่งจะแสดงไฟล์และไดเรกทอรีแต่ละรายการโดยอ้างอิงด้วย
COLUMN_DOCUMENT_ID
ที่ไม่ซ้ำกัน รหัสเอกสารจะซ้ำกันไม่ได้และจะไม่เปลี่ยนแปลงเมื่อออกแล้ว เนื่องจากจะใช้สำหรับการให้สิทธิ์ URI แบบถาวรเมื่ออุปกรณ์รีบูต - เอกสารอาจเป็นไฟล์ที่เปิดได้ซึ่งมีประเภท MIME ที่เฉพาะเจาะจง หรือไดเรกทอรีที่มีเอกสารเพิ่มเติมซึ่งมีประเภท MIME
MIME_TYPE_DIR
- เอกสารแต่ละรายการอาจมีความสามารถแตกต่างกัน ตามที่อธิบายโดย
COLUMN_FLAGS
เช่นFLAG_SUPPORTS_WRITE
,FLAG_SUPPORTS_DELETE
และFLAG_SUPPORTS_THUMBNAIL
COLUMN_DOCUMENT_ID
เดียวกันรวมอยู่ในไดเรกทอรีได้หลายรายการ
ควบคุมโฟลว์
โมเดลข้อมูลของผู้ให้บริการเอกสารจะอิงตามลําดับชั้นไฟล์แบบดั้งเดิม อย่างไรก็ตาม คุณสามารถจัดเก็บข้อมูลของคุณได้ตามต้องการ ตราบใดที่คุณเข้าถึงข้อมูลได้โดยใช้ DocumentsProvider
API เช่น คุณสามารถใช้พื้นที่เก็บข้อมูลระบบคลาวด์ตามแท็กสำหรับข้อมูลของคุณ
รูปที่ 2 แสดงวิธีที่แอปรูปภาพอาจใช้ SAF เพื่อเข้าถึงข้อมูลที่จัดเก็บไว้
รูปที่ 2 ขั้นตอนการขอสิทธิ์เข้าถึงพื้นที่เก็บข้อมูล
ข้อควรทราบ
- ใน SAF ผู้ให้บริการและลูกค้าจะไม่โต้ตอบกันโดยตรง ไคลเอ็นต์ขอสิทธิ์ในการโต้ตอบกับไฟล์ ซึ่งหมายถึงการอ่าน แก้ไข สร้าง หรือลบไฟล์
- การโต้ตอบจะเริ่มขึ้นเมื่อแอปพลิเคชัน เช่น แอปรูปภาพในตัวอย่างนี้ เริ่มใช้งาน Intent
ACTION_OPEN_DOCUMENT
หรือACTION_CREATE_DOCUMENT
เจตนาอาจรวมตัวกรองเพื่อปรับแต่งเกณฑ์เพิ่มเติม เช่น "แสดงไฟล์ที่เปิดได้ทั้งหมดซึ่งมีประเภท MIME เป็น "image"" - เมื่อ Intent เริ่มทํางาน เครื่องมือเลือกของระบบจะไปที่ผู้ให้บริการที่ลงทะเบียนแต่ละราย และแสดงรูทเนื้อหาที่ตรงกันให้ผู้ใช้เห็น
- เครื่องมือเลือกช่วยให้ผู้ใช้มีอินเทอร์เฟซมาตรฐานในการเข้าถึงเอกสาร แม้ว่าผู้ให้บริการเอกสารที่เกี่ยวข้องจะแตกต่างกันมากก็ตาม เช่น รูปที่ 2 แสดงผู้ให้บริการ Google ไดรฟ์ ผู้ให้บริการ USB และผู้ให้บริการระบบคลาวด์
ในรูปที่ 3 ผู้ใช้กำลังเลือกโฟลเดอร์ดาวน์โหลดจากเครื่องมือเลือกที่เปิดขึ้นในการค้นหารูปภาพ เครื่องมือเลือกยังแสดงรูททั้งหมดที่ใช้ได้กับแอปไคลเอ็นต์ด้วย
รูปที่ 3 เครื่องมือเลือกที่แสดงโฟลเดอร์ดาวน์โหลดซึ่งเลือกไว้เป็นตำแหน่งการค้นหา
หลังจากผู้ใช้เลือกโฟลเดอร์ดาวน์โหลดแล้ว รูปภาพจะแสดงขึ้น รูปภาพ 4 แสดงผลลัพธ์ของกระบวนการนี้ ตอนนี้ผู้ใช้โต้ตอบกับรูปภาพได้ในรูปแบบที่ผู้ให้บริการและแอปไคลเอ็นต์รองรับ
รูปที่ 4 รูปภาพที่จัดเก็บไว้ในโฟลเดอร์ดาวน์โหลดตามที่แสดงในเครื่องมือเลือกของระบบ
เขียนแอปไคลเอ็นต์
ใน Android 4.3 หรือต่ำกว่า หากต้องการให้แอปเรียกข้อมูลไฟล์จากแอปอื่น แอปจะต้องเรียกใช้ Intent เช่น ACTION_PICK
หรือ ACTION_GET_CONTENT
จากนั้นผู้ใช้จะเลือกแอปเดียวเพื่อเลือกไฟล์ แอปที่เลือกต้องมีอินเทอร์เฟซผู้ใช้เพื่อให้ผู้ใช้เรียกดูและเลือกจากไฟล์ที่มีได้
ใน Android 4.4 (API ระดับ 19) ขึ้นไป คุณจะมีตัวเลือกเพิ่มเติมในการใช้ ACTION_OPEN_DOCUMENT
Intent ซึ่งจะแสดง UI เครื่องมือเลือกที่ระบบควบคุม ซึ่งช่วยให้ผู้ใช้เรียกดูไฟล์ทั้งหมดที่แอปอื่นๆ ให้บริการได้ จาก UI เดียวนี้ ผู้ใช้สามารถเลือกไฟล์จากแอปที่รองรับได้
ใน Android 5.0 (API ระดับ 21) ขึ้นไป คุณยังใช้ ACTION_OPEN_DOCUMENT_TREE
Intent ได้ด้วย ซึ่งจะช่วยให้ผู้ใช้เลือกไดเรกทอรีสำหรับแอปไคลเอ็นต์ที่จะเข้าถึงได้
หมายเหตุ: ACTION_OPEN_DOCUMENT
ไม่ได้ใช้แทน ACTION_GET_CONTENT
วิธีที่จะใช้จะขึ้นอยู่กับความต้องการของแอป
- ใช้
ACTION_GET_CONTENT
หากต้องการให้แอปอ่านหรือนําเข้าข้อมูล เมื่อใช้วิธีนี้ แอปจะนำเข้าสําเนาของข้อมูล เช่น ไฟล์รูปภาพ - ใช้
ACTION_OPEN_DOCUMENT
หากต้องการให้แอปของคุณมีสิทธิ์เข้าถึงเอกสารที่เจ้าของเอกสารเป็นเจ้าของได้อย่างต่อเนื่องในระยะยาว ตัวอย่างเช่น แอปแต่งรูปที่อนุญาตให้ผู้ใช้แก้ไขรูปภาพที่จัดเก็บไว้ในผู้ให้บริการเอกสาร
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีรองรับการเรียกดูไฟล์และไดเรกทอรีโดยใช้ UI เครื่องมือเลือกของระบบได้ที่คู่มือเกี่ยวกับการเข้าถึงเอกสารและไฟล์อื่นๆ
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับผู้ให้บริการเอกสารได้จากแหล่งข้อมูลต่อไปนี้
ตัวอย่าง
วิดีโอ
- DevBytes: เฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูลของ Android 4.4: ผู้ให้บริการ
- ไฟล์เสมือนในเฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูล