จัดการไฟล์ทั้งหมดในอุปกรณ์จัดเก็บข้อมูล

แอปส่วนใหญ่ที่ต้องเข้าถึงพื้นที่เก็บข้อมูลที่แชร์สามารถปฏิบัติตามแนวทางปฏิบัติแนะนำสำหรับการแชร์ไฟล์สื่อและการแชร์ไฟล์ที่ไม่ใช่สื่อ อย่างไรก็ตาม แอปบางแอปมีกรณีการใช้งานหลักที่ต้องมีการเข้าถึงไฟล์แบบกว้างในอุปกรณ์ แต่ไม่สามารถเข้าถึงไฟล์เหล่านั้นได้อย่างมีประสิทธิภาพโดยใช้แนวทางปฏิบัติแนะนำด้านพื้นที่เก็บข้อมูลที่เคารพความเป็นส่วนตัว Android มีสิทธิ์เข้าถึงพิเศษของแอปที่เรียกว่าการเข้าถึงไฟล์ทั้งหมดสำหรับสถานการณ์เหล่านี้

ตัวอย่างเช่น กรณีการใช้งานหลักของแอปป้องกันไวรัสอาจต้องมีการสแกนไฟล์จำนวนมากในไดเรกทอรีต่างๆ เป็นประจำ หากการสแกนนี้ต้องมีการโต้ตอบกับผู้ใช้ซ้ำๆ เพื่อเลือกไดเรกทอรีโดยใช้เครื่องมือเลือกไฟล์ของระบบ ก็จะทำให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ไม่ดี กรณีการใช้งานอื่นๆ เช่น แอปจัดการไฟล์ แอปสำรองและกู้คืนข้อมูล และแอปจัดการเอกสาร ต้องพิจารณาในลักษณะเดียวกัน

ขอสิทธิ์เข้าถึงไฟล์ทั้งหมด

แอปสามารถขอสิทธิ์เข้าถึงไฟล์ทั้งหมดจากผู้ใช้ได้โดยทำดังนี้

  1. ประกาศสิทธิ์ MANAGE_EXTERNAL_STORAGE ในไฟล์ Manifest
  2. ใช้การดำเนินการของ Intent ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION เพื่อนำผู้ใช้ไปยังหน้าการตั้งค่าระบบที่ผู้ใช้สามารถเปิดใช้ตัวเลือกต่อไปนี้สำหรับแอปของคุณได้ อนุญาตให้เข้าถึงเพื่อจัดการไฟล์ทั้งหมด

หากต้องการตรวจสอบว่าแอปได้รับMANAGE_EXTERNAL_STORAGE สิทธิ์หรือไม่ ให้เรียกใช้ Environment.isExternalStorageManager()

การดำเนินการที่ได้รับอนุญาตจาก MANAGE_EXTERNAL_STORAGE

สิทธิ์ MANAGE_EXTERNAL_STORAGE จะให้สิทธิ์ต่อไปนี้

  • สิทธิ์การอ่านและการเขียนไฟล์ทั้งหมดภายในพื้นที่เก็บข้อมูลที่แชร์

  • เข้าถึงเนื้อหาของตาราง MediaStore.Files

  • สิทธิ์เข้าถึงไดเรกทอรีรากของทั้งไดรฟ์ USB On-The-Go (OTG) และการ์ด SD

  • สิทธิ์การเขียนไดเรกทอรีที่จัดเก็บข้อมูลภายในทั้งหมด ยกเว้น /Android/data/, /sdcard/Android และไดเรกทอรีย่อยส่วนใหญ่ของ /sdcard/Android สิทธิ์เขียนนี้รวมถึงสิทธิ์เข้าถึงเส้นทางไฟล์ โดยตรง

    แอปที่ได้รับสิทธิ์นี้จะยังคงเข้าถึงไดเรกทอรีเฉพาะแอปของแอปอื่นๆ ไม่ได้ เนื่องจากไดเรกทอรีเหล่านี้จะปรากฏเป็นไดเรกทอรีย่อยของ Android/data/ ใน วอลุ่มพื้นที่เก็บข้อมูล

เมื่อแอปมีMANAGE_EXTERNAL_STORAGEสิทธิ์ดังกล่าว แอปจะเข้าถึงไฟล์และไดเรกทอรีเพิ่มเติมเหล่านี้ได้โดยใช้ API MediaStore หรือเส้นทางไฟล์โดยตรง อย่างไรก็ตาม เมื่อใช้กรอบการเข้าถึงพื้นที่เก็บข้อมูล คุณจะเข้าถึงไฟล์หรือไดเรกทอรีได้ก็ต่อเมื่อทำได้โดยไม่ต้องมีสิทธิ์ MANAGE_EXTERNAL_STORAGE

เรียกใช้กิจกรรมการจัดการพื้นที่เก็บข้อมูลของแอปอื่น

ใน Android 12 (API ระดับ 31) ขึ้นไป แอปที่มีทั้งสิทธิ์ MANAGE_EXTERNAL_STORAGE และสิทธิ์ QUERY_ALL_PACKAGES เช่น แอปการจัดการไฟล์ จะใช้ getManageSpaceActivityIntent() เพื่อส่งผู้ใช้ไปยังกิจกรรมการจัดการพื้นที่ที่กำหนดเองของแอปอื่นได้

เมธอด getManageSpaceActivityIntent() จะรับชื่อแพ็กเกจและรหัสคำขอ และจะแสดงผลอย่างใดอย่างหนึ่งต่อไปนี้

  • PendingIntent หากแอปที่มีชื่อแพ็กเกจที่ระบุได้กำหนดกิจกรรม "จัดการพื้นที่เก็บข้อมูล" ที่กำหนดเอง จากนั้นแอปจัดการไฟล์ที่เรียกใช้เมธอด getManageSpaceActivityIntent() จะเรียกใช้ Intent ที่ส่งคืนเพื่อส่งผู้ใช้ไปยังกิจกรรมที่กำหนดเองได้
  • null หากแอปที่มีชื่อแพ็กเกจที่ระบุไม่ได้กำหนดกิจกรรม "manage space"

เปิดใช้ MANAGE_EXTERNAL_STORAGE สำหรับการทดสอบ

หากต้องการดูว่าสิทธิ์ MANAGE_EXTERNAL_STORAGE ส่งผลต่อแอปอย่างไร คุณ สามารถเปิดใช้สิทธิ์สำหรับการทดสอบได้ โดยเรียกใช้คำสั่งต่อไปนี้ในเครื่องที่เชื่อมต่อกับอุปกรณ์ทดสอบ

adb shell appops set --uid PACKAGE_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 มี นโยบายที่จำกัดการใช้สิทธิ์

รูปที่ 1 คำเตือน Lint ใน Android Studio ที่ช่วยเตือนนักพัฒนาแอปเกี่ยวกับนโยบายของ Google Play ที่เกี่ยวข้องกับMANAGE_EXTERNAL_STORAGE สิทธิ์

ขอMANAGE_EXTERNAL_STORAGEสิทธิ์เฉพาะเมื่อแอปของคุณไม่สามารถใช้ API ที่เคารพความเป็นส่วนตัวมากขึ้นอย่างมีประสิทธิภาพ เช่น Storage Access Framework หรือ Media Store API การใช้งานสิทธิ์ของแอปต้องอยู่ในการใช้งานที่อนุญาต และต้องเชื่อมโยงโดยตรงกับฟังก์ชันการทำงานหลักของแอป หากแอปของคุณมีกรณีการใช้งานที่คล้ายกับกรณีใดกรณีหนึ่งต่อไปนี้ แอปก็น่าจะขอMANAGE_EXTERNAL_STORAGEสิทธิ์ได้