12/08/2018, 14:09

Permission trong Android (Part 3): Các chú ý khi yêu cầu cấp quyền

Trong phần 3 này mình sẽ giới thiệu cho các bạn về các chú ý khi yêu cầu cấp quyền trong Android. Các phần trước: Permission in Android (Part 1) - Khai báo các quyền (permission) cho ứng dụng Permission trong Android (Part 2) - Yêu cầu cấp quyền khi ứng dụng đang chạy Rất dễ dàng để 1 ứng ...

Trong phần 3 này mình sẽ giới thiệu cho các bạn về các chú ý khi yêu cầu cấp quyền trong Android. Các phần trước:

  • Permission in Android (Part 1) - Khai báo các quyền (permission) cho ứng dụng
  • Permission trong Android (Part 2) - Yêu cầu cấp quyền khi ứng dụng đang chạy

Rất dễ dàng để 1 ứng dụng khiến người dùng quá tải với quá nhiều yêu cầu cấp quyền. Nếu 1 người dùng cảm thấy khó chịu khi sử dụng, hay người dùng lo lắng về việc ứng dụng có thể truy cập vào thông tin cá nhân của họ, họ có thể sẽ tránh sử dụng hay gỡ bỏ ứng dụng. Các chú ý sau đây sẽ giúp bạn tránh được các trường hợp như vậy

Cân nhắc sử dụng Intent

Trong nhiều trường hợp, bạn có thể chọn giữa 2 cách để ứng dụng của bạn thực hiện nhiệm vụ. Bạn có thể khiến ứng dụng yêu cầu quyền để thực hiện các thao tác của nó. Cách khác, bạn có thể sử dụng intent để 1 ứng dụng khác trên thiết bị thực hiện nhiệm vụ.

Ví dụ, giả sử ứng dụng của bạn cần chụp ảnh với máy ảnh của thiết bị. Ứng dụng có thể yêu cầu quyền truy cập vào máy ảnh trực tiếp. Sau đó ứng dụng của bạn sẽ sử dụng camera APIs để điều khiển máy ảnh và chụp ảnh. Cách làm này cho phép ứng dụng toàn quyền kiểm soát với quá trình chụp ảnh và để bạn kết hợp giao diện camera vào ứng dụng.

Tuy nhiên, nếu bạn không cần quyền kiểm soát hoàn toàn như vậy, bạn có thể sử dụng intent ACTION_IMAGE_CAPTURE để yêu cầu 1 bức ảnh. Khi bạn gửi intent này, hệ thống sẽ gợi ý người dùng chọn 1 ứng dụng camera (nếu không có ứng dụng camera mặc định). Người dùng chụp ảnh với ứng dụng đã chọn và ứng dụng đó sẽ trả bức ảnh về ứng dụng của bạn qua phuơng thức [onActivityResult()](https://developer.android.com/reference/android/app/Activity.html#onActivityResult(int, int, android.content.Intent))

Nếu bạn sử dụng các quyền:

  • Ứng dụng có thể toàn quyền kiểm soát trải nghiệm người dùng khi bạn thực hiện thao tác. Tuy nhiên, việc kiểm soát như vậy khiến công việc của bạn phức tạp, vì bạn cần thiết kế giao diện người dùng phù hợp
  • Người dùng được yêu cầu cấp quyền 1 lần, vào lúc đang chạy hoặc lúc cài đặt. Sau đó, ứng dụng của bạn có thể thực hiện thao tác mà không yêu cầu thêm tuơng tác của người dùng. Tuy nhiên, nếu người dùng không cấp quyền, hay chọn để sau, ứng dụng của bạn sẽ không thể thực hiện thao tác cần thiết.

Nếu bạn sử dụng intent:

  • Bạn không phải thiết kế giao diện cho thao tác. Ứng dụng xử lý intent cung cấp giao diện. Tuy nhiên, điều này có nghĩa bạn không thể kiểm soát trải nghiệm người dùng. Người dùng có thể tuơng tác với ứng dụng mà bạn chưa bao giờ nhìn thấy.
  • Nếu người dùng không có ứng dụng mặc định cho thao tác, hệ thống yêu cầu người dùng chọn ứng dụng. Nếu người dùng không thiết lập cách xử lý mặc định, họ có thể gặp phải bảng thông báo mỗi lần họ thực hiện thao tác.

Chỉ yêu cầu các quyền mà bạn cần

Mỗi lần bạn yêu cầu 1 quyền, bạn buộc người dùng phải quyết định. Bạn nên giảm thiểu số lần yêu cầu xuống thấp nhất. Nếu người dùng chạy Android 6.0 (API 23) hoặc cao hơn, mỗi lần người dùng thử các tính năng mới của ứng dụng mà cần cấp quyền, ứng dụng phải can thiệp vào công việc của người dùng với yêu cầu cấp quyền. Nếu người dùng đang chạy phiên bản cũ của Android, người dùng phải cấp tất cả các quyền cho ứng dụng khi đang cài đặt. Vì những lý do này, bạn nên hạn chế tối đa số quyền mà ứng dụng cần được cấp.

Đừng làm người dùng khó chịu

Nếu người dùng sử dụng Android 6.0 hoặc cao hơn, người dùng phải cấp các quyền cho ứng dụng khi đang sử dụng. Nếu bạn yêu cầu người dùng cấp quá nhiều quyền 1 lúc, bạn có thể khiến người dùng khó chịu và thoát ứng dụng. Thay vào đó, bạn nên yêu cầu cấp quyền chỉ khi thực sự cần đến.

Trong vài trường hợp, 1 hoặc nhiều quyền có thể vô cùng cần thiết với ứng dụng của bạn, khi đó bạn có thể yêu cầu cấp quyên ngay khi ứng dụng khởi động. Ví dụ, nếu bạn tạo 1 ứng dụng chụp ảnh, ứng dụng sẽ cần truy cập vào camera của thiết bị. Khi người dùng khởi động ứng dụng lần đầu tiên, họ sẽ không ngạc nhiên khi được yêu cầu cấp quyền sử dụng camera. Nhưng nếu cùng ứng dụng đó có chức năng chia sẻ ảnh với danh sách trong danh bạ người dùng, bạn không nên yêu cầu quyền READ_CONTACTS ngay lần đầu tiên khởi động ứng dụng. Thay vào đó, đợi tới khi người dùng sử dụng chức năng chia sẻ thì hãy yêu cầu.

Nếu ứng dụng của bạn cung cấp hướng dẫn, bạn có thể yêu cầu các quyền cần thiết ngay khi hướng dẫn kết thúc.

Giải thích tại sao bạn cần được cấp quyền

Hộp hội thoại yêu cầu cấp quyền được hiển thị bởi hệ thống khi gọi phuơng thức requestPermissions() cho thấy quyền mà bạn cần nhưng không giải thích vì sao. Vì vậy trong 1 vài trường hợp người dùng có thể cảm thấy khó hiểu, bạn nên giải thích cho người dùng tại sao mà ứng dụng của bạn cần quyền đó trước khi yêu cầu được cấp quyền.

1 cách để thông báo cho người dùng là kết hợp các yêu cầu này vào 1 bản hướng dẫn cho ứng dụng. Bản hướng dẫn có thể chỉ ra từng chức năng của ứng dụng, và khi đó, bạn có thể giải thích những quyền nào cần thiết. Ví dụ, hướng dẫn của ứng dụng chụp ảnh có thể chỉ ra chức năng chia sẻ ảnh với danh bạ của bạn, sau đó cho người dùng biết rằng họ cần cấp quyền để ứng dụng có thể truy cập vào danh bạ. Sau đó ứng dụng có thể gọi phuơng thức requestPermissions() để yêu cầu người dùng cấp quyền. Dĩ nhiên, không phải mọi người dùng đều làm theo hướng dẫn, vì vậy bạn vẫn cần kiểm tra và yêu cầu người dùng cấp quyền khi ứng dụng thực hiện các chức năng của nó.

Kiểm thử cả 2 mẫu quyền trong Android

Từ Android 6.0 trở lên, người dùng cấp quyền khi ứng dụng đang chạy, thay vì làm vậy khi cài đặt. Kết quả, bạn phải kiểm thử ứng dụng của bạn dưới rất nhiều điều kiện. Trước Android 6.0, bạn có thể cho rằng khi ứng dụng của bạn đang chạy, nó đã được cấp tất cả quyền cần thiết. Nhưng với đặc điểm mới của Android 6.0, bạn không thử mặc định như vậy đựoc nữa.

Các điều sau sẽ giúp bạn xác định các vấn đề liên quan đến cấp quyền trên các thiết bị chạy Android 6.0 trở lên:

  • Xác định các quyền hiện tại trong ứng dụng của bạn.
  • Kiểm tra các thao tác người dùng bằng dữ liệu và dịch vụ bảo vệ quyền.
  • Kiểm tra với nhiều loại quyền kết hợp
  • Sử dụng công cụ adb để quản lý các quyền từ dòng lệnh (command line):
  • Danh sách các quyền và trạng thái theo nhóm:
$ adb shell pm list permissions -d -g
  • Cấp hoặc gọi 1 hoặc nhiều quyền:
$ adb shell pm [grant|revoke] <permission-name> ...

0