เปิดไฟล์โดยใช้เฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูล

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_DOCUMENTIntent ซึ่งจะแสดง 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 เครื่องมือเลือกของระบบได้ที่คู่มือเกี่ยวกับการเข้าถึงเอกสารและไฟล์อื่นๆ

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับผู้ให้บริการเอกสารได้จากแหล่งข้อมูลต่อไปนี้

ตัวอย่าง

วิดีโอ