Yêu cầu quyền đặc biệt

Quyền đặc biệt giúp bảo vệ quyền truy cập vào các tài nguyên hệ thống đặc biệt nhạy cảm hoặc không liên quan trực tiếp đến quyền riêng tư của người dùng. Các quyền này khác với quyền khi cài đặtquyền khi bắt đầu chạy.

Hình 1: Màn hình Quyền truy cập đặc biệt của ứng dụng trong phần cài đặt hệ thống.

Một số ví dụ về quyền đặc biệt gồm có:

  • Lên lịch báo thức chính xác.
  • Hiển thị và vẽ trên các ứng dụng khác.
  • Truy cập vào mọi dữ liệu về bộ nhớ.

Các ứng dụng khai báo quyền đặc biệt sẽ xuất hiện trên trang Quyền truy cập đặc biệt của ứng dụng trong phần cài đặt hệ thống (hình 1). Để cấp quyền đặc biệt cho ứng dụng, người dùng phải chuyển đến trang này: Cài đặt > Ứng dụng > Quyền truy cập đặc biệt của ứng dụng.

Quy trình làm việc

Để yêu cầu quyền đặc biệt, hãy làm như sau:

  1. Trong tệp kê khai của ứng dụng, hãy khai báo các quyền đặc biệt mà ứng dụng của bạn có thể yêu cầu.
  2. Thiết kế trải nghiệm người dùng trên ứng dụng của bạn để thao tác cụ thể trong ứng dụng liên kết với một số quyền đặc biệt. Cho người dùng biết những thao tác nào có thể yêu cầu họ cấp quyền cho ứng dụng truy cập vào dữ liệu riêng tư của người dùng.
  3. Chờ người dùng gọi ra nhiệm vụ hoặc thao tác trong ứng dụng mà yêu cầu quyền truy cập vào dữ liệu riêng tư của người dùng. Tại thời điểm đó, ứng dụng của bạn có thể yêu cầu quyền đặc biệt để truy cập dữ liệu đó.
  4. Kiểm tra xem liệu người dùng đã cấp quyền đặc biệt mà ứng dụng của bạn yêu cầu chưa. Để thực hiện việc này, hãy sử dụng hàm kiểm tra tuỳ chỉnh của từng quyền. Nếu đã được cấp quyền, ứng dụng của bạn có thể truy cập vào dữ liệu riêng tư của người dùng. Nếu không, hãy chuyển sang bước tiếp theo. Lưu ý: Bạn phải kiểm tra xem mình có quyền hay không mỗi khi thực hiện một thao tác yêu cầu quyền đó.
  5. Đưa ra lý do cho người dùng trong một thành phần trên giao diện người dùng, giúp giải thích rõ ràng loại dữ liệu mà ứng dụng của bạn đang cố gắng truy cập và những lợi ích ứng dụng có thể cung cấp cho người dùng nếu họ cấp quyền đặc biệt. Ngoài ra, vì ứng dụng của bạn đưa người dùng đến phần cài đặt hệ thống để cấp quyền cũng như đưa vào các hướng dẫn ngắn gọn giải thích cách người dùng có thể cấp quyền ở đó. Giao diện người dùng để đưa ra lý do phải cung cấp một tuỳ chọn rõ ràng để người dùng chọn không cấp quyền. Sau khi người dùng xác nhận lý do, hãy tiếp tục chuyển sang bước tiếp theo.
  6. Yêu cầu cấp quyền đặc biệt mà ứng dụng của bạn cần để truy cập vào dữ liệu riêng tư của người dùng. Việc này có thể liên quan đến ý định chuyển đến trang tương ứng trong phần cài đặt hệ thống để người dùng có thể cấp quyền. Không giống như quyền khi bắt đầu chạy, hộp thoại cấp quyền sẽ không bật lên.
  7. Kiểm tra phản hồi của người dùng, xem họ chọn cấp hay từ chối cấp quyền đặc biệt trong phương thức onResume().
  8. Nếu người dùng đã cấp quyền cho ứng dụng của bạn, thì bạn có thể truy cập vào dữ liệu riêng tư của người dùng. Thay vào đó, nếu người dùng từ chối cấp quyền, hãy xuống cấp nhẹ cho trải nghiệm ứng dụng của bạn để cung cấp chức năng cho người dùng khi không có thông tin được bảo vệ bằng quyền đó.
Hình 2: Quy trình khai báo và yêu cầu cấp các quyền đặc biệt trên Android.

Yêu cầu quyền đặc biệt

Không giống như quyền khi bắt đầu chạy, người dùng phải cấp các quyền đặc biệt trên trang Quyền truy cập đặc biệt của ứng dụng trong phần cài đặt hệ thống. Các ứng dụng có thể đưa người dùng đến đó bằng cách sử dụng ý định. Ý định này sẽ tạm dừng ứng dụng và khởi chạy trang cài đặt tương ứng cho một quyền đặc biệt nhất định. Sau khi người dùng quay lại ứng dụng, ứng dụng có thể kiểm tra xem quyền đã được cấp trong hàm onResume() hay chưa.

Mã mẫu sau đây trình bày cách yêu cầu người dùng cấp quyền đặc biệt SCHEDULE_EXACT_ALARMS:

val alarmManager = getSystemService<AlarmManager>()!!
when {
   // if permission is granted, proceed with scheduling exact alarms…
   alarmManager.canScheduleExactAlarms() -> {
       alarmManager.setExact(...)
   }
   else -> {
       // ask users to grant the permission in the corresponding settings page
       startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
   }
}

Mã mẫu để kiểm tra quyền và xử lý các quyết định của người dùng trong onResume():

override fun onResume() {
   // ...

   if (alarmManager.canScheduleExactAlarms()) {
       // proceed with the action (setting exact alarms)
       alarmManager.setExact(...)
   }
   else {
       // permission not yet approved. Display user notice and gracefully degrade
       your app experience.
       alarmManager.setWindow(...)
   }
}

Mẹo và các phương pháp hay nhất

Các phần sau đây trình bày một số phương pháp hay nhất và những điểm cần cân nhắc khi yêu cầu các quyền đặc biệt.

Mỗi quyền có một phương thức kiểm tra riêng

Các quyền đặc biệt hoạt động khác với quyền khi bắt đầu chạy. Thay vào đó, hãy tham khảo trang Tài liệu tham khảo API về quyền và sử dụng các hàm kiểm tra quyền truy cập tuỳ chỉnh cho từng quyền đặc biệt. Ví dụ gồm có: AlarmManager#canScheduleExactAlarms() cho quyền SCHEDULE_EXACT_ALARMSEnvironment#isExternalStorageManager() cho quyền MANAGE_EXTERNAL_STORAGE.

Yêu cầu trong ngữ cảnh

Tương tự như các quyền khi bắt đầu chạy, ứng dụng nên yêu cầu các quyền đặc biệt theo ngữ cảnh khi người dùng yêu cầu một thao tác cụ thể cần có quyền đó. Ví dụ: chờ yêu cầu cấp quyền SCHEDULE_EXACT_ALARMS cho đến khi người dùng lên lịch gửi email vào một thời điểm cụ thể.

Giải thích yêu cầu

Đưa ra lý do trước khi chuyển hướng đến phần cài đặt hệ thống. Vì người dùng tạm thời rời khỏi ứng dụng để cấp các quyền đặc biệt, nên hãy hiển thị giao diện người dùng trong ứng dụng trước khi bạn khởi chạy ý định chuyển đến trang Quyền truy cập đặc biệt của ứng dụng trong phần cài đặt hệ thống. Giao diện người dùng này sẽ giải thích rõ lý do ứng dụng cần có quyền và cách người dùng cấp quyền đó trên trang cài đặt.