Quản lý mọi tệp trên một thiết bị lưu trữ

Phần lớn các ứng dụng yêu cầu quyền truy cập vào bộ nhớ dùng chung đều có thể làm theo các phương pháp hay nhất để chia sẻ tệp nội dung nghe nhìnchia sẻ tệp không phải nội dung nghe nhìn. Tuy nhiên, một số ứng dụng có trường hợp sử dụng cốt lõi yêu cầu quyền truy cập trên phạm vi rộng vào các tệp trên thiết bị, nhưng không thể truy cập hiệu quả bằng cách sử dụng các phương pháp hay nhất về bộ nhớ tôn trọng quyền riêng tư. Android cung cấp quyền truy cập đặc biệt có tên là quyền truy cập vào mọi tệp trong những tình huống này.

Ví dụ: Một trường hợp sử dụng chính của ứng dụng chống vi-rút có thể yêu cầu thường xuyên quét nhiều tệp trên các thư mục khác nhau. Nếu quá trình quét này yêu cầu người dùng phải tương tác nhiều lần để chọn các thư mục bằng bộ chọn tệp hệ thống, thì quá trình này có thể đem lại trải nghiệm người dùng không tốt. Các trường hợp sử dụng khác – chẳng hạn như ứng dụng trình quản lý tệp, ứng dụng sao lưu và khôi phục, cũng như các ứng dụng quản lý tài liệu – có thể cần cân nhắc các yếu tố tương tự.

Yêu cầu quyền truy cập vào mọi tệp

Một ứng dụng có thể yêu cầu người dùng cấp quyền truy cập vào mọi tệp bằng cách thực hiện các thao tác sau:

  1. Khai báo quyền MANAGE_EXTERNAL_STORAGE trong tệp kê khai.
  2. Sử dụng thao tác theo ý định ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION để chuyển hướng người dùng tới trang cài đặt hệ thống. Tại đây, người dùng có thể bật tuỳ chọn sau cho ứng dụng của mình: Allow access to manage all files (Cho phép truy cập để quản lý tất cả các tệp).

Để xác định xem ứng dụng của bạn đã được cấp quyền MANAGE_EXTERNAL_STORAGE hay chưa, hãy gọi Environment.isExternalStorageManager().

Các thao tác mà MANAGE_EXTERNAL_STORAGE cho phép

Quyền MANAGE_EXTERNAL_STORAGE cấp những quyền sau:

  • Quyền đọc và ghi tất cả tệp để trong bộ nhớ dùng chung.

  • Truy cập vào nội dung của bảng MediaStore.Files.

  • Quyền truy cập vào thư mục gốc của cả ổ đĩa USB di động (OTG) và thẻ SD.

  • Quyền ghi tất cả các thư mục bộ nhớ trong, ngoại trừ /Android/data/, /sdcard/Android và hầu hết các thư mục con của /sdcard/Android. Quyền ghi này bao gồm quyền truy cập đường dẫn tệp trực tiếp.

    Các ứng dụng được cấp quyền này vẫn không thể truy cập vào thư mục dành riêng cho ứng dụng thuộc về các ứng dụng khác vì các thư mục này xuất hiện dưới dạng thư mục con của Android/data/ trong một phương tiện bộ nhớ.

Khi một ứng dụng có quyền MANAGE_EXTERNAL_STORAGE, ứng dụng đó có thể truy cập vào các tệp và thư mục bổ sung này bằng API MediaStore hoặc đường dẫn tệp trực tiếp. Tuy nhiên, khi sử dụng Khung truy cập bộ nhớ (Storage Access Framework), bạn chỉ có thể truy cập tệp hoặc thư mục nếu bạn có thể truy cập mà không cần quyền MANAGE_EXTERNAL_STORAGE.

Gọi hoạt động quản lý bộ nhớ của ứng dụng khác

Trên Android 12 (API cấp 31) trở lên, những ứng dụng có cả quyền MANAGE_EXTERNAL_STORAGE và quyền QUERY_ALL_PACKAGES, chẳng hạn như các ứng dụng quản lý tệp, có thể sử dụng getManageSpaceActivityIntent() để đưa người dùng đến hoạt động quản lý dung lượng tuỳ chỉnh của ứng dụng khác.

Phương thức getManageSpaceActivityIntent() lấy tên gói và mã yêu cầu, đồng thời sẽ trả về một trong các mục sau:

  • PendingIntent, nếu ứng dụng có tên gói được chỉ định đã xác định một hoạt động "manage space" (quản lý dung lượng) tuỳ chỉnh. Sau đó, ứng dụng quản lý tệp tên là phương thức getManageSpaceActivityIntent() có thể gọi ý định được trả về để chuyển người dùng đến hoạt động tuỳ chỉnh.
  • null, nếu ứng dụng có tên gói được chỉ định không xác định hoạt động "manage space" (quản lý dung lượng).

Bật MANAGE_EXTERNAL_STORAGE để kiểm thử

Để khám phá xem quyền MANAGE_EXTERNAL_STORAGE ảnh hưởng như thế nào đến ứng dụng của bạn, bạn có thể bật quyền này cho mục đích kiểm thử. Để làm như vậy, hãy chạy lệnh sau trên máy đã kết nối với thiết bị kiểm thử của bạn:

adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow

Thông báo của Google Play

Phần này thông báo cho các nhà phát triển phát hành ứng dụng trên Google Play.

Để hạn chế quyền truy cập trên phạm vi rộng vào bộ nhớ dùng chung, Cửa hàng Google Play đã cập nhật chính sách để đánh giá các ứng dụng nhắm mục tiêu đến Android 11 (API cấp 30) trở lên và yêu cầu quyền truy cập vào mọi tệp thông qua quyền MANAGE_EXTERNAL_STORAGE. Chính sách này sẽ có hiệu lực kể từ tháng 5 năm 2021.

Khi ứng dụng của bạn nhắm mục tiêu đến Android 11 trở lên và khai báo quyền MANAGE_EXTERNAL_STORAGE, Android Studio sẽ hiển thị cảnh báo tìm lỗi mã nguồn như trong hình 1. Cảnh báo này nhắc bạn rằng Cửa hàng Google Play có chính sách giới hạn việc sử dụng quyền này.

Hình 1. Cảnh báo tìm lỗi mã nguồn trong Android Studio nhắc nhà phát triển về chính sách của Google Play liên quan đến quyền MANAGE_EXTERNAL_STORAGE.

Chỉ yêu cầu quyền MANAGE_EXTERNAL_STORAGE khi ứng dụng của bạn không thể tận dụng hiệu quả các API tôn trọng quyền riêng tư hơn, chẳng hạn như Khung quyền truy cập bộ nhớ hoặc API Lưu trữ nội dung nghe nhìn. Việc sử dụng quyền của ứng dụng phải nằm trong phạm vi sử dụng được phép và phải liên quan trực tiếp đến chức năng cốt lõi của ứng dụng. Nếu ứng dụng của bạn bao gồm một trường hợp sử dụng tương tự như bất kỳ trường hợp sử dụng nào sau đây, thì có thể ứng dụng sẽ yêu cầu cấp quyền MANAGE_EXTERNAL_STORAGE: