+2

[Android] Runtime permisstion (PermissionsDispatcher).

I.Giới thiệu

  • Từ phiên bản Android 6.0 (Marshmallow) trở đi sẽ được tích hợp chức năng kiểm soát quyền truy cập Permissions cho các ứng dụng.
  • Quyền truy cập được gộp thành các nhóm ( Permission Group),
  • Với tính năng mới này người dùng có thể thay đổi quyền truy cập của ứng dụng bất cứ khi nào.
  • Vì vậy các ứng dụng trên Android M cần phải check permission khi chạy để tránh trường hợp ứng dụng bị force close do thiếu một số permission cần thiết bị tắt bởi người dùng.
  • Để cho việc xử lý việc Permission luôn đảm bảo đầy đủ chúng ta phải thực hiện Runtime permission.
  • Việc Runtime permission cũng phải xứ lý mất nhiều thời gian, tốn nhiều dòng code.
  • Thông thường các dev hay có thói quen check tất cả các Permission mà app cần sử dụng 1 lượt rồi chạy Code, làm như vậy không được tối ưu gây ra các xử lý thừa không cần thiết. VD như muốn có Permission để thực hiện bật Camera mà khi click vào để bật Camera lại hiện ra 1 loạt các yêu cầu quyền Permission khác thì không được hay cho lắm.
  • Mình sẽ hướng dẫn các bạn cách check Permission theo từng hàm , lại còn rất đơn giản và code lại ngắn.

II.Cách thực hiện

  1. Sử dụng thêm 1 thư viện cho việc thực hiện trở nên đơn giản hơn

    • Thư viện mình muốn dùng là PermissionsDispatcher
    • PermissionsDispatcher hỗ trợ trên API 4 và JDK 1.8 thoải mái mà dùng
    • PermissionsDispatcher cung cấp một API dựa trên chú thích đơn giản để xử lý các điều khoản cho phép chạy trên Android Marshmallow
    • PermissionsDispatcher còn có thể dùng trên cả Fragment,
  2. Cách sử dụng

    • B1: Muốn dùng Permission nào thì các bạn cứ khai báo trong AndroidManifest như cách thông thường:

          <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
          <uses-permission android:name="android.permission.CAMERA"/>
      
    • B2: Add thêm thư viện, vào file build.gradle thêm 2 dòng code là xong

         compile 'com.github.hotchemi:permissionsdispatcher:2.3.0'
         annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.3.0'
      
    • B3: Trong Activity hay trong Fragment các bạn dùng thêm 4 hàm check sau. (hoặc có thể viết trong 1 file Base lần sau dùng chỉ cần gọi)

      @RuntimePermissions
      public class MainActivity extends AppCompatActivity {
      

      -> Thêm RuntimePermissions trước Activity hoặc Fragment cần request Permissions

         @OnShowRationale({
              Manifest.permission.READ_PHONE_STATE,
              Manifest.permission.CAMERA
          })
          void showRationaleForLogin(final PermissionRequest request) {
              new AlertDialog.Builder(this)
                  .setMessage("Phone state and camera state are need to login function")
                  .setPositiveButton("Allow", (dialog, button) -> request.proceed())
                  .setNegativeButton("Deny", (dialog, button) -> request.cancel())
                  .setCancelable(false)
                  .show();
          }
      

      -> Hiển thị dialog để yêu cầu Permission, các bạn thích custom cho nó đẹp hơn thì viết lại cái AlertDialog. Ở đây mình đang dùng mặc định và thêm mấy cái text đơn giản vào.

              @OnPermissionDenied({
              Manifest.permission.READ_PHONE_STATE,
              Manifest.permission.CAMERA
          })
          void showDeniedForLogin() {
              Toast.makeText(this, "Phone state or camera state was denied." +
                      " Please consider granting it in order to access the login function",
                  Toast.LENGTH_SHORT).show();
          }
      

      -> Bắt điều khiện khi người dùng từ chối khích hoạt Permissions cho hệ thống.

          @OnNeverAskAgain({
              Manifest.permission.READ_PHONE_STATE,
              Manifest.permission.CAMERA
          })
          void showNeverAskForLogin() {
              Toast.makeText(this, "Phone state or wifi state was denied with never ask again.",
                  Toast.LENGTH_SHORT).show();
          }
      

      -> Bắt điều khiện khi người dùng không tiếp tục hỏi quyền Permissions

    • B4: Đến đây qua trình khởi tạo và bắt lỗi đã hoàn thành, muốn check Permissions cho hàm nào chỉ việc thêm keyword @NeedsPermission trên đầu các hàm đó, như bên dưới mình đã check 2 Permission (READ_PHONE_STATE / CAMERA) cho hàm successPermission.

         @NeedsPermission({
              Manifest.permission.READ_PHONE_STATE,
              Manifest.permission.CAMERA
          })
          void successPermission() {
              Toast.makeText(this, "Show Permission", Toast.LENGTH_SHORT).show();
          }
      

      -> Để sử dụng hàm này với mục đích Rumtime khi build hệ thống sinh ra 1 class dạng (Name_PermissionsDispatcher) trong đó name là tên Activity hoặc Fragment được khởi tạo @RuntimePermissions. Thay vì gọi hàm theo cách thông thường hãy gọi hàm thông qua class được sinh ra đó, như bên dưới

      MainActivityPermissionsDispatcher.successPermissionWithCheck(this);
      

IV.Kết Thúc

  • Với việc xử lý bên trên các bạn sẽ tiết kiệm rất nhiều thời gian, công sức và khối lượng code cho việc runtime permission, Việc Runtimepermissin giờ đây đã trở thành điều hiển nhiên phải có của mỗi app vì thế chọn cho mình 1 phương pháp check hiệu quả là rất cần thiết, thay vì dùng cách check thông thường, các bạn thử tham khảo cách của mình nhé.
  • Tài liệu tham khảo: https://github.com/hotchemi/PermissionsDispatcher
  • Demo: https://github.com/tiendatframgia/runtime-permission
  • Xin cảm ơn các bạn đã đọc.

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí