แอปส่วนใหญ่ที่ต้องมีการเข้าถึงพื้นที่เก็บข้อมูลที่ใช้ร่วมกันสามารถปฏิบัติตามตัวเลือกที่ดีที่สุด แนวทางปฏิบัติในการแชร์สื่อ ไฟล์ และการแชร์ที่ไม่ใช่สื่อ ไฟล์ อย่างไรก็ตาม แอปมีกรณีการใช้งานหลักที่ต้องเข้าถึงไฟล์แบบกว้างในอุปกรณ์ แต่ ไม่สามารถเข้าถึงได้อย่างมีประสิทธิภาพโดยใช้แนวทางปฏิบัติแนะนำเกี่ยวกับพื้นที่เก็บข้อมูลที่เคารพความเป็นส่วนตัว Android ให้สิทธิ์พิเศษแก่แอปที่เรียกว่าการเข้าถึงไฟล์ทั้งหมดสำหรับ เท่านั้น
เช่น กรณีการใช้งานหลักของแอปป้องกันไวรัสอาจต้องมีการสแกนเป็นประจำ ไฟล์จำนวนมากในไดเรกทอรีต่างๆ หากการสแกนนี้กำหนดให้ผู้ใช้โต้ตอบซ้ำๆ เพื่อเลือกไดเรกทอรีโดยใช้เครื่องมือเลือกไฟล์ของระบบ ผู้ใช้จะได้รับประสบการณ์การใช้งานที่ไม่ดี กรณีการใช้งานอื่นๆ เช่น แอปจัดการไฟล์ แอปสำรองและกู้คืนข้อมูล และแอปการจัดการเอกสาร จะต้องมีแอปที่คล้ายกัน ข้อควรพิจารณา
ขอสิทธิ์เข้าถึงไฟล์ทั้งหมด
แอปสามารถขอสิทธิ์เข้าถึงไฟล์ทั้งหมดจากผู้ใช้ได้โดยทำดังนี้
- ประกาศสิทธิ์
MANAGE_EXTERNAL_STORAGE
ในไฟล์ Manifest - ใช้การดำเนินการตามเจตนา
ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
เพื่อนำผู้ใช้ไปยังหน้าการตั้งค่าระบบที่ผู้ใช้สามารถเปิดใช้ตัวเลือกต่อไปนี้สำหรับแอปของคุณได้ อนุญาตให้เข้าถึงเพื่อจัดการไฟล์ทั้งหมด
เพื่อดูว่าแอปได้รับสิทธิ์MANAGE_EXTERNAL_STORAGE
หรือไม่
สิทธิ์, โทร
Environment.isExternalStorageManager()
การดำเนินการที่ MANAGE_EXTERNAL_STORAGE อนุญาต
สิทธิ์ MANAGE_EXTERNAL_STORAGE
ให้สิทธิ์ต่อไปนี้
สิทธิ์การอ่านและการเขียนไฟล์ทั้งหมดภายในพื้นที่เก็บข้อมูลที่ใช้ร่วมกัน
เข้าถึงเนื้อหาของตาราง
MediaStore.Files
สิทธิ์เข้าถึงไดเรกทอรีรากของทั้งไดรฟ์ USB แบบใช้ได้ทุกที่ทุกเวลา (OTG) และ SD
สิทธิ์การเขียนไดเรกทอรีที่จัดเก็บข้อมูลภายในทั้งหมด ยกเว้น
/Android/data/
,/sdcard/Android
และไดเรกทอรีย่อยส่วนใหญ่ของ/sdcard/Android
สิทธิ์การเขียนนี้รวมถึงไฟล์โดยตรง เส้นทางแอปที่ได้รับสิทธิ์นี้จะยังคงเข้าถึงไดเรกทอรีเฉพาะแอปที่เป็นของแอปอื่นๆ ไม่ได้ เนื่องจากไดเรกทอรีเหล่านี้จะปรากฏเป็นไดเรกทอรีย่อยของ
Android/data/
ในวอลุ่มพื้นที่เก็บข้อมูล
เมื่อแอปมีสิทธิ์ MANAGE_EXTERNAL_STORAGE
แอปจะเข้าถึงฟีเจอร์เหล่านี้ได้
ไฟล์และไดเรกทอรีเพิ่มเติมโดยใช้
MediaStore
API หรือไฟล์โดยตรง
เส้นทาง เมื่อคุณใช้
เฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูล
แต่คุณสามารถเข้าถึงไฟล์หรือไดเรกทอรีได้ก็ต่อเมื่อไม่มี
ที่มีสิทธิ์ MANAGE_EXTERNAL_STORAGE
เรียกใช้กิจกรรมการจัดการพื้นที่เก็บข้อมูลของแอปอื่น
ใน Android 12 (API ระดับ 31) ขึ้นไป แอปที่มีทั้งสิทธิ์ MANAGE_EXTERNAL_STORAGE
และสิทธิ์ QUERY_ALL_PACKAGES
เช่น แอปการจัดการไฟล์ จะใช้ getManageSpaceActivityIntent()
เพื่อส่งผู้ใช้ไปยังกิจกรรมการจัดการพื้นที่ที่กำหนดเองของแอปอื่นได้
เมธอด getManageSpaceActivityIntent()
จะใช้ชื่อแพ็กเกจและ
ขอรหัส และแสดงค่าใดค่าหนึ่งต่อไปนี้
PendingIntent
หากแอปที่มี ชื่อแพ็กเกจที่ระบุมีการกำหนด "จัดการพื้นที่" ที่กำหนดเอง กิจกรรม ไฟล์ แอปการจัดการที่เรียกใช้เมธอดgetManageSpaceActivityIntent()
จะสามารถ เรียกใช้ Intent ที่แสดงผลเพื่อส่งผู้ใช้ไปยังกิจกรรมที่กำหนดเองnull
หากแอปที่มีชื่อแพ็กเกจที่ระบุไม่ได้กำหนดกิจกรรม "จัดการพื้นที่ทำงาน"
เปิดใช้ MANAGE_EXTERNAL_STORAGE สำหรับการทดสอบ
หากต้องการสำรวจว่าสิทธิ์ MANAGE_EXTERNAL_STORAGE
ส่งผลต่อแอปของคุณอย่างไร ให้ทำดังนี้
สามารถเปิดใช้สิทธิ์สำหรับการทดสอบได้ หากต้องการดำเนินการดังกล่าว ให้เรียกใช้คำสั่งต่อไปนี้
ในเครื่องที่เชื่อมต่อกับอุปกรณ์ทดสอบ ดังนี้
adb shell appops set --uidPACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow
การแจ้งเตือนของ Google Play
ส่วนนี้จะแจ้งให้ทราบสำหรับนักพัฒนาแอปที่เผยแพร่แอปใน Google Play
Google Play Store ได้อัปเดตนโยบายเพื่อประเมินแอปที่กำหนดเป้าหมายเป็น Android 11 (API ระดับ 30) ขึ้นไปและขอสิทธิ์เข้าถึงไฟล์ทั้งหมดผ่านสิทธิ์ MANAGE_EXTERNAL_STORAGE
เพื่อจำกัดการเข้าถึงแบบกว้างในพื้นที่เก็บข้อมูลที่ใช้ร่วมกัน นโยบายนี้มีผลตั้งแต่เดือนพฤษภาคม 2021
เมื่อแอปกำหนดเป้าหมายเป็น Android 11 ขึ้นไปและประกาศสิทธิ์ MANAGE_EXTERNAL_STORAGE
แล้ว Android Studio จะแสดงคำเตือนเกี่ยวกับ Lint ที่ปรากฏในรูปที่ 1 คำเตือนนี้จะช่วยเตือนให้คุณทราบว่า Google Play Store มี
นโยบายที่จำกัดการใช้สิทธิ์ดังกล่าว
MANAGE_EXTERNAL_STORAGE
ขอสิทธิ์ MANAGE_EXTERNAL_STORAGE
เฉพาะในกรณีที่แอปใช้ API ที่เป็นมิตรกับความเป็นส่วนตัวมากขึ้นอย่างมีประสิทธิภาพไม่ได้ เช่น เฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูลหรือ MediaStore API การใช้งานสิทธิ์ของแอปต้องอยู่ภายใต้การใช้งานที่อนุญาต และต้องเชื่อมโยงโดยตรงกับฟังก์ชันหลักของแอป หากแอปมี Use Case ที่คล้ายกับกรณีต่อไปนี้ ก็มีความเป็นไปได้ว่าแอปจะขอสิทธิ์ MANAGE_EXTERNAL_STORAGE
ได้
- ตัวจัดการไฟล์
- แอปสำรองและกู้คืนข้อมูล
- แอปป้องกันไวรัส
- แอปการจัดการเอกสาร
- การค้นหาไฟล์ในอุปกรณ์
- การเข้ารหัสดิสก์และไฟล์
- การย้ายข้อมูลระหว่างอุปกรณ์