การอัปเดตพื้นที่เก็บข้อมูลใน Android 11

Android 11 (ระดับ API 30) ปรับปรุงแพลตฟอร์มเพิ่มเติมเพื่อให้การปกป้องข้อมูลแอปและข้อมูลผู้ใช้ในที่จัดเก็บข้อมูลภายนอกได้ดียิ่งขึ้น รุ่นนี้มีการปรับปรุงหลายอย่าง เช่น การเข้าถึงเส้นทางไฟล์ดิบ การดำเนินการแก้ไขเป็นกลุ่มสำหรับสื่อ และ UI ที่อัปเดตสำหรับเฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูล

นอกจากนี้ เวอร์ชันนี้ยังมีการปรับปรุงพื้นที่เก็บข้อมูลที่กำหนดขอบเขต ซึ่งช่วยให้นักพัฒนาแอปสามารถตอบสนองกรณีการใช้งานพื้นที่เก็บข้อมูลได้ง่ายขึ้นหลังจากย้ายข้อมูลไปใช้โมเดลพื้นที่เก็บข้อมูลนี้

การบังคับใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต

แอปที่ทำงานบน Android 11 แต่กำหนดเป้าหมายเป็น Android 10 (ระดับ API 29) จะยังคงขอแอตทริบิวต์ requestLegacyExternalStorage ได้ แฟล็กนี้ช่วยให้แอปเลือกไม่รับการเปลี่ยนแปลงชั่วคราวที่เชื่อมโยงกับพื้นที่เก็บข้อมูลที่กำหนดขอบเขต เช่น การให้สิทธิ์เข้าถึงไดเรกทอรีต่างๆ และไฟล์สื่อประเภทต่างๆ หลังจากที่คุณอัปเดตแอปให้กำหนดเป้าหมายเป็น Android 11 ระบบจะไม่สนใจแฟล็ก requestLegacyExternalStorage

รักษาความเข้ากันได้กับ Android 10

หากแอปเลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตเมื่อทำงานในอุปกรณ์ Android 10 เราขอแนะนำให้คุณตั้งค่า requestLegacyExternalStorage เป็น true ในไฟล์ Manifest ของแอปต่อไป วิธีนี้จะช่วยให้แอปทำงานได้ตามที่คาดไว้ในอุปกรณ์ที่ใช้ Android 10 ต่อไป

ย้ายข้อมูลไปยังไดเรกทอรีที่มองเห็นได้เมื่อใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต

หากแอปใช้โมเดลพื้นที่เก็บข้อมูลเดิมและก่อนหน้านี้กำหนดเป้าหมายเป็น Android 10 หรือต่ำกว่า คุณอาจจัดเก็บข้อมูลไว้ในไดเรกทอรีที่แอปเข้าถึงไม่ได้เมื่อเปิดใช้โมเดลพื้นที่เก็บข้อมูลที่กำหนดขอบเขต ก่อนกำหนดเป้าหมายเป็น Android 11 ให้ย้ายข้อมูลไปยังไดเรกทอรีที่เข้ากันได้กับพื้นที่เก็บข้อมูลที่กำหนดขอบเขต

ทดสอบพื้นที่เก็บข้อมูลที่กำหนดขอบเขต

หากต้องการเปิดใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตในแอป ไม่ว่าเวอร์ชัน SDK เป้าหมายของแอปและค่าแฟล็กไฟล์ Manifest จะเป็นอย่างไร ให้เปิดใช้แฟล็กความเข้ากันได้ของแอปต่อไปนี้

  • DEFAULT_SCOPED_STORAGE (เปิดใช้สำหรับแอปทั้งหมดโดยค่าเริ่มต้น)
  • FORCE_ENABLE_SCOPED_STORAGE (ปิดใช้สำหรับแอปทั้งหมดโดยค่าเริ่มต้น)

หากต้องการปิดใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตและใช้โมเดลพื้นที่เก็บข้อมูลเดิมแทน ให้ยกเลิกการตั้งค่าทั้ง 2 แฟล็ก

จัดการพื้นที่เก็บข้อมูลในอุปกรณ์

ตั้งแต่ Android 11 เป็นต้นไป แอปที่ใช้โมเดลพื้นที่เก็บข้อมูลที่กำหนดขอบเขตจะเข้าถึงได้เฉพาะไฟล์แคชเฉพาะแอปของตนเองเท่านั้น หากแอปของคุณจำเป็นต้องจัดการพื้นที่เก็บข้อมูลของอุปกรณ์ ให้ทำตามวิธีการค้นหาพื้นที่ว่าง

  1. ตรวจสอบพื้นที่ว่างโดยเรียกใช้การดำเนินการตาม Intent ACTION_MANAGE_STORAGE
  2. หากอุปกรณ์มีพื้นที่ว่างไม่เพียงพอ ให้แจ้งผู้ใช้เพื่อให้ความยินยอมแก่แอปของคุณในการล้างแคชทั้งหมด โดยเรียกใช้การดำเนินการตาม Intent ACTION_CLEAR_APP_CACHE

ไดเรกทอรีเฉพาะแอปในพื้นที่เก็บข้อมูลภายนอก

ตั้งแต่ Android 11 เป็นต้นไป แอปจะไม่สามารถสร้างไดเรกทอรีเฉพาะแอปในที่จัดเก็บข้อมูลภายนอกของตนเองได้ หากต้องการเข้าถึงไดเรกทอรีที่ระบบจัดเตรียมไว้ให้แอป ให้เรียกใช้ getExternalFilesDirs()

สิทธิ์เข้าถึงไฟล์สื่อ

Android 11 เพิ่มความสามารถต่อไปนี้เพื่อให้เข้าถึงสื่อได้ง่ายขึ้นขณะที่ยังคงรักษาความเป็นส่วนตัวของผู้ใช้ไว้

ดำเนินการเป็นกลุ่ม

Android 11 เพิ่มวิธีการหลายวิธีที่ช่วยให้จัดการกลุ่มไฟล์สื่อได้ง่ายขึ้น เพื่อความสอดคล้องกันในอุปกรณ์ต่างๆ และเพิ่มความสะดวกให้แก่ผู้ใช้

เข้าถึงไฟล์โดยใช้เส้นทางไฟล์โดยตรงและไลบรารีแบบเนทีฟ

เพื่อช่วยให้แอปทำงานร่วมกับคลังสื่อของบุคคลที่สามได้อย่างราบรื่นยิ่งขึ้น Android 11 จึงอนุญาตให้คุณใช้ API อื่นนอกเหนือจาก MediaStore API เพื่อเข้าถึงไฟล์สื่อจากพื้นที่เก็บข้อมูลที่ใช้ร่วมกันโดยใช้เส้นทางไฟล์โดยตรง API เหล่านี้รวมถึงรายการต่อไปนี้

  • API ของ File
  • ไลบรารีแบบเนทีฟ เช่น fopen()

สิทธิ์เข้าถึงข้อมูลจากแอปอื่นๆ

เพื่อปกป้องความเป็นส่วนตัวของผู้ใช้ ในอุปกรณ์ที่ใช้ Android 11 ขึ้นไป ระบบจะจำกัดการเข้าถึงไดเรกทอรีส่วนตัวของแอปอื่นๆ เพิ่มเติม

สิทธิ์เข้าถึงไดเรกทอรีข้อมูลในที่จัดเก็บข้อมูลภายใน

Android 9 (ระดับ API 28) เริ่มจำกัดแอปที่สามารถทำให้ไฟล์ในไดเรกทอรีข้อมูลในที่จัดเก็บข้อมูลภายในเข้าถึงได้โดยแอปอื่นๆ แอปที่กำหนดเป้าหมายเป็น Android 9 ขึ้นไปไม่สามารถทำให้ไฟล์ในไดเรกทอรีข้อมูลของตนเข้าถึงได้แบบสาธารณะ

Android 11 ได้ขยายข้อจำกัดนี้ หากแอปกำหนดเป้าหมายเป็น Android 11 แอปจะไม่สามารถเข้าถึงไฟล์ในไดเรกทอรีข้อมูลของแอปอื่นๆ ได้ แม้ว่าแอปอื่นๆ จะกำหนดเป้าหมายเป็น Android 8.1 (ระดับ API 27) หรือต่ำกว่า และทำให้ไฟล์ในไดเรกทอรีข้อมูลของตนอ่านได้แบบสาธารณะก็ตาม

สิทธิ์เข้าถึงไดเรกทอรีเฉพาะแอปในพื้นที่เก็บข้อมูลภายนอก

ใน Android 11 แอปจะไม่สามารถเข้าถึงไฟล์ในไดเรกทอรีเฉพาะของแอปอื่นๆ ภายในที่จัดเก็บข้อมูลภายนอกได้อีกต่อไป

การจำกัดการเข้าถึงเอกสาร

เพื่อให้เวลานักพัฒนาแอปในการทดสอบ การเปลี่ยนแปลงต่อไปนี้ที่เกี่ยวข้องกับ Storage Access Framework (SAF) จะมีผลก็ต่อเมื่อแอปของคุณกำหนดเป้าหมายเป็น Android 11 ขึ้นไปเท่านั้น

สิทธิ์เข้าถึงไดเรกทอรี

คุณไม่สามารถใช้การดำเนินการตาม Intent ACTION_OPEN_DOCUMENT_TREE เพื่อขอสิทธิ์เข้าถึงไดเรกทอรีต่อไปนี้ได้อีกต่อไป

  • ไดเรกทอรีรากของวอลุ่มที่จัดเก็บข้อมูลภายใน
  • ไดเรกทอรีรากของวอลุ่มการ์ด SD แต่ละรายการที่ผู้ผลิตอุปกรณ์พิจารณาว่าเชื่อถือได้ ไม่ว่าการ์ดนั้นจะเป็นแบบจำลองหรือถอดออกได้ก็ตาม ไดรฟ์ข้อมูลที่เชื่อถือได้คือไดรฟ์ข้อมูลที่แอปสามารถเข้าถึงได้สำเร็จเกือบตลอดเวลา
  • ไดเรกทอรี Download

สิทธิ์เข้าถึงไฟล์

คุณไม่สามารถใช้การดำเนินการตาม Intent ACTION_OPEN_DOCUMENT_TREE หรือ ACTION_OPEN_DOCUMENT เพื่อขอให้ผู้ใช้เลือกไฟล์แต่ละไฟล์จากไดเรกทอรีต่อไปนี้ได้อีกต่อไป

  • ไดเรกทอรี Android/data/ และไดเรกทอรีย่อยทั้งหมด
  • ไดเรกทอรี Android/obb/ และไดเรกทอรีย่อยทั้งหมด

ทดสอบการเปลี่ยนแปลง

หากต้องการทดสอบการเปลี่ยนแปลงลักษณะการทำงานนี้ ให้ทำดังนี้

  1. เรียกใช้ Intent ด้วยการดำเนินการ ACTION_OPEN_DOCUMENT ตรวจสอบว่าไดเรกทอรี Android/data/ และ Android/obb/ ไม่ปรากฏทั้งคู่
  2. ทำตามข้อใดข้อหนึ่งต่อไปนี้
    • เปิดใช้แฟล็กความเข้ากันได้ของแอป RESTRICT_STORAGE_ACCESS_FRAMEWORK
    • กำหนดเป้าหมายเป็น Android 11 ขึ้นไป
  3. เรียกใช้ Intent ด้วยการดำเนินการ ACTION_OPEN_DOCUMENT_TREE ตรวจสอบว่าไดเรกทอรี Download ปรากฏขึ้นและปุ่มดำเนินการที่เชื่อมโยงกับไดเรกทอรีเป็นสีเทา

สิทธิ์

Android 11 มีการเปลี่ยนแปลงต่อไปนี้ที่เกี่ยวข้องกับสิทธิ์เข้าถึงพื้นที่เก็บข้อมูล

กำหนดเป้าหมายเวอร์ชันใดก็ได้

กล่องโต้ตอบแรกจะแสดงลิงก์ที่ชื่อว่า "อนุญาตในการตั้งค่า"
รูปที่ 1 กล่องโต้ตอบที่แสดงเมื่อแอปใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตและขอสิทธิ์ READ_EXTERNAL_STORAGE

การเปลี่ยนแปลงต่อไปนี้จะมีผลใน Android 11 ไม่ว่าแอปของคุณจะใช้ SDK เวอร์ชันเป้าหมายใดก็ตาม

  • สิทธิ์รันไทม์พื้นที่เก็บข้อมูลเปลี่ยนชื่อเป็นไฟล์และสื่อ
  • หากแอปไม่ได้เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตและขอสิทธิ์ READ_EXTERNAL_STORAGE ผู้ใช้จะเห็นกล่องโต้ตอบที่แตกต่างจาก Android 10 กล่องโต้ตอบจะระบุว่าแอปของคุณกำลังขอสิทธิ์เข้าถึงรูปภาพและสื่อ ดังที่แสดงในรูปที่ 1

    ผู้ใช้สามารถดูได้ว่าแอปใดมีสิทธิ์ READ_EXTERNAL_STORAGE ในการตั้งค่าระบบ ในหน้าการตั้งค่า > ความเป็นส่วนตัว > เครื่องมือจัดการสิทธิ์ > ไฟล์และสื่อ แอปแต่ละแอปที่มีสิทธิ์จะแสดงอยู่ในส่วนอนุญาตสำหรับไฟล์ทั้งหมด หากแอปกำหนดเป้าหมายเป็น Android 11 โปรดทราบว่าสิทธิ์เข้าถึง "ไฟล์ทั้งหมด" นี้เป็นแบบอ่านอย่างเดียว หากต้องการอ่านและเขียนไฟล์ทั้งหมดในพื้นที่เก็บข้อมูลที่ใช้ร่วมกันโดยใช้แอปนี้ คุณต้องมีสิทธิ์การเข้าถึงไฟล์ทั้งหมด

กำหนดเป้าหมายเป็น Android 11

หากแอปกำหนดเป้าหมายเป็น Android 11 ทั้งสิทธิ์ WRITE_EXTERNAL_STORAGE และสิทธิ์ที่มีสิทธิ์พิเศษ WRITE_MEDIA_STORAGE จะไม่ให้สิทธิ์เข้าถึงเพิ่มเติมอีกต่อไป

โปรดทราบว่าในอุปกรณ์ที่ใช้ Android 10 (ระดับ API 29) ขึ้นไป แอปของคุณสามารถมีส่วนร่วมในคอลเล็กชันสื่อที่กำหนดไว้อย่างชัดเจน เช่น MediaStore.Downloads โดยไม่ต้องขอสิทธิ์ที่เกี่ยวข้องกับพื้นที่เก็บข้อมูล ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีขอเฉพาะสิทธิ์ที่จำเป็นเมื่อทำงานกับไฟล์สื่อในแอป

การเข้าถึงไฟล์ทั้งหมด

แอปส่วนใหญ่ที่ต้องเข้าถึงพื้นที่เก็บข้อมูลที่ใช้ร่วมกันสามารถทำตามแนวทางปฏิบัติแนะนำสำหรับการแชร์ไฟล์สื่อและการแชร์ไฟล์ที่ไม่ใช่สื่อ อย่างไรก็ตาม แอปบางแอปมีกรณีการใช้งานหลักที่ต้องใช้สิทธิ์เข้าถึงแบบกว้างสำหรับไฟล์ในอุปกรณ์ แต่ไม่สามารถดำเนินการได้อย่างมีประสิทธิภาพโดยใช้แนวทางปฏิบัติแนะนำด้านพื้นที่เก็บข้อมูลที่เคารพความเป็นส่วนตัว Android มีสิทธิ์เข้าถึงพิเศษของแอปที่เรียกว่าการเข้าถึงไฟล์ทั้งหมดสำหรับสถานการณ์เหล่านี้ ดูข้อมูลเพิ่มเติมได้ที่คำแนะนำเกี่ยวกับวิธีจัดการไฟล์ทั้งหมดในอุปกรณ์จัดเก็บข้อมูล

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

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

บล็อกโพสต์

วิดีโอ