1. 程式人生 > >關於EasyPermission的使用(包括在fragment中)

關於EasyPermission的使用(包括在fragment中)

1、我們在android6.0之前的許可權都是直接在manifest裡面申請,然後就直接可以使用該許可權相關的一些操作,說的好聽叫申請還不如叫宣告許可權。谷歌發現很多app胡亂使用使用者的許可權,甚至惡意使用,所以就對許可權進行了管理。現在很多許可權不能直接在manifest裡面申請就完事了,還必須要使用者親手授予全下。所以在做相關操作的時候必須先要判斷使用者是否已經給予了該許可權,否則app會crush滴。。。

2、一相機許可權為例子,做相關操作的時候必須做三個步驟:

  (1)檢查使用者是否已經授予了許可權:

int result = ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
        if (result == PackageManager.PERMISSION_GRANTED) {
            // 有許可權

        } else if (result == PackageManager.PERMISSION_DENIED) {
            // 沒有許可權

            // 2. 申請許可權
            ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.CAMERA},
                    REQUEST_CAMERA);
        }


  (2)在沒有許可權的情況下要向用戶申請許可權。我已經寫在上面了。

  (3)處理申請結果:

 @Override
    public void onRequestPermissionsResult(
            int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_CAMERA) {
            int result = grantResults[0];
            if (result == PackageManager.PERMISSION_DENIED) {
                // 使用者沒有給許可權
                Log.d(TAG, "onRequestPermissionsResult: 使用者拒絕給許可權");

                // 引導使用者去設定介面開啟許可權
                showSettingsDialog();
            } else if (result == PackageManager.PERMISSION_GRANTED) {
                // 使用者授予
               
            }
        }


3、如果是隻申請很少的許可權那麼還好,但是需要申請的許可權多起來之後就尷尬了,所以就出了EasyPermiss方便使用:

   (1)匯入依賴:

compile 'pub.devrel:easypermissions:0.1.9'
   (2)使用:
使用理念也是分三個步驟:

        Step 1:檢查許可權:

public void readContacts(View view) {
        boolean hasPermissions = EasyPermissions.hasPermissions(this,
                Manifest.permission.READ_CONTACTS,
                Manifest.permission.READ_SMS
        );

        if (hasPermissions) {
            // 有許可權
            readContacts();
        } else {
            // 沒有許可權
            EasyPermissions.requestPermissions(this,
                    "需要讀取聯絡人的許可權",
                    REQUEST_CONTACTS,
                    Manifest.permission.READ_CONTACTS,
                    Manifest.permission.READ_SMS);
        }

  Step 2:沒有許可權就申請許可權,也在上面程式碼片中。

  Step 3:處理申請結果:先複寫onRequestPermissionResult,然後實現implements EasyPermissions.PermissionCallbacks的兩個方法。

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

    @Override
    public void onPermissionsGranted(int requestCode, List<String> perms) {
        if (requestCode == REQUEST_CONTACTS) {
            if (perms.contains(Manifest.permission.READ_CONTACTS)) {
                readContacts();
            }
        }
    }

    @Override
    public void onPermissionsDenied(int requestCode, List<String> perms) {
        if (requestCode == REQUEST_CONTACTS) {
            EasyPermissions.checkDeniedPermissionsNeverAskAgain(
                    this,
                    "需要讀取聯絡人的許可權, 請到設定裡面開啟許可權",
                    android.R.string.ok,
                    android.R.string.cancel,
                    perms
            );
        }
    }

4、以上是在activity中的使用,但是我們現在開發中越來越多的實在fragment中寫程式碼,那麼在fragment是一樣的使用方法麼?這個就要摸索了。我就踩坑了,我在fragment裡面申請許可權沒有問題,但是一直無法處理申請結果。我發現是重寫的onRequestPermissionResult沒有走,我就把處理結果在activity中進行完成。在activity中進行重寫該方法,然後在activity中實現implements EasyPermissions.PermissionCallbacks兩個方法,是可以的。