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