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