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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

การเข้าถึงไฟล์สื่อ

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

ดำเนินการแบบเป็นชุด

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

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

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

  • File API
  • ไลบรารีที่มาพร้อมเครื่อง เช่น fopen()

การเข้าถึงข้อมูลจากแอปอื่นๆ

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

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

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

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

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

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

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

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

การเข้าถึงไดเรกทอรี

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

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

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

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

  • ไดเรกทอรี 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 ได้จากสื่อต่อไปนี้

บล็อกโพสต์

วิดีโอ