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 เป็นต้นไป แอปที่ใช้โมเดลพื้นที่เก็บข้อมูลที่กำหนดขอบเขตจะเข้าถึงได้เฉพาะไฟล์แคชเฉพาะแอปของตนเองเท่านั้น หากแอปของคุณจำเป็นต้องจัดการพื้นที่เก็บข้อมูลของอุปกรณ์ ให้ทำตามวิธีการค้นหาพื้นที่ว่าง
- ตรวจสอบพื้นที่ว่างโดยเรียกใช้การดำเนินการตาม Intent
ACTION_MANAGE_STORAGE หากอุปกรณ์มีพื้นที่ว่างไม่เพียงพอ ให้แจ้งผู้ใช้เพื่อให้ความยินยอมแก่แอปของคุณในการล้างแคชทั้งหมด โดยเรียกใช้การดำเนินการตาม 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/และไดเรกทอรีย่อยทั้งหมด
ทดสอบการเปลี่ยนแปลง
หากต้องการทดสอบการเปลี่ยนแปลงลักษณะการทำงานนี้ ให้ทำดังนี้
- เรียกใช้ Intent ด้วยการดำเนินการ
ACTION_OPEN_DOCUMENTตรวจสอบว่าไดเรกทอรีAndroid/data/และAndroid/obb/ไม่ปรากฏทั้งคู่ - ทำตามข้อใดข้อหนึ่งต่อไปนี้
- เปิดใช้แฟล็กความเข้ากันได้ของแอป
RESTRICT_STORAGE_ACCESS_FRAMEWORK - กำหนดเป้าหมายเป็น Android 11 ขึ้นไป
- เปิดใช้แฟล็กความเข้ากันได้ของแอป
- เรียกใช้ Intent ด้วยการดำเนินการ
ACTION_OPEN_DOCUMENT_TREEตรวจสอบว่าไดเรกทอรีDownloadปรากฏขึ้นและปุ่มดำเนินการที่เชื่อมโยงกับไดเรกทอรีเป็นสีเทา
สิทธิ์
Android 11 มีการเปลี่ยนแปลงต่อไปนี้ที่เกี่ยวข้องกับสิทธิ์เข้าถึงพื้นที่เก็บข้อมูล
กำหนดเป้าหมายเวอร์ชันใดก็ได้
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 ได้จากแหล่งข้อมูลต่อไปนี้