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

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

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

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

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

  • File API
  • ไลบรารีที่มาพร้อมเครื่อง เช่น 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 ขึ้นไปเท่านั้น เพื่อให้นักพัฒนาแอปมีเวลาทำการทดสอบ

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

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

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

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

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

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

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

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

  1. เรียกใช้ Intent ด้วยการดำเนินการ ACTION_OPEN_DOCUMENT ตรวจสอบว่าทั้งไดเรกทอรี Android/data/ และ Android/obb/ ไม่ปรากฏ
  2. ทำตามข้อใดข้อหนึ่งต่อไปนี้
    • เปิดใช้ Flag 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 ได้ที่เนื้อหาต่อไปนี้

บล็อกโพสต์

วิดีโอ