運行時權限請求框架easypermissions


  • 前言

  之前使用過AndPermission權限申請庫,當開發者執行有權限的代碼發生異常時,AndPermission會抓到異常並回調到失敗中,這里要注意的是會抓到任何異常,不僅僅是沒有權限時的異常.

這使得我在正常授權的回調中的一些異常,甚至是崩潰的異常都被它捕捉了,因此導致了一個奇怪的現象:權限申請到了,但是彈出了我在onDenied()方法中的吐司...

那么,我當時是不知道是因為自己的邏輯出現了錯誤,導致這個現象的,所以到處去找解決辦法,去翻AndPermission的Issues和反復閱讀文檔,遺憾的是當時我並沒有主要到上面那句話...

於是,我就使用了另外一個權限申請庫,這就是接下來要講的easypermissions,它是googlesamples里的一個成員,因此是谷歌推薦的權限申請庫,放心大膽的使用吧.

  • easypermissions使用步驟
  1. 依賴  
    dependencies {
        implementation 'pub.devrel:easypermissions:1.2.0' } 

    請注意,EasyPermissions依賴於 Android Support Library 27.1.0 因此你需要使用 compileSdkVersion 27或更高版本。此更改應該是安全的,因為compileSdkVersion不會更改應用行為。

  2. 必要准備

    在你的Activity中重寫onRequestPermissionsResult 方法    

    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    
            // Forward results to EasyPermissions
            EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
        }
    }
  3. 申請權限
    private fun checkPermissions() {
       //首先判斷權限是否已被授權,防止重復申請權限時,多次回調
    if (EasyPermissions.hasPermissions(this@MainActivity, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO...)) { //do something } else { EasyPermissions.requestPermissions(this@MainActivity, "為了方便錄音,我們需要您的麥克風權限和讀寫權限", 100, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO)
    //第一個參數是context對象,第一個參數是提示字符串,第三個參數是請求碼(可在回調中用來匹配),第四個參數是權限數組 } }

     

  4. 回調  

    @AfterPermissionGranted(100)
    private void methodRequiresTwoPermission() { String[] perms = {Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION}; if (EasyPermissions.hasPermissions(this, perms)) { // Already have permission, do the thing // ... } else { // Do not have permissions, request them now EasyPermissions.requestPermissions(this,"為了方便錄音,我們需要您的麥克風權限和讀寫權限", 100, perms);
      }
    }
    權限申請的回調有多種,上面只是其中一種,通過@AfterPermissionGranted(請求碼)的方式.

    此外,你還可以實現PermissionCallbacks 接口

    public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    
            // Forward results to EasyPermissions
            EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
        }
    
        @Override
        public void onPermissionsGranted(int requestCode, List<String> list) {
            // Some permissions have been granted
            // ...
        }
    
        @Override
        public void onPermissionsDenied(int requestCode, List<String> list) {
            // Some permissions have been denied
            // ...
        }
    }

    值得注意的是onPermissionsGranted和onPermissionsDenied兩回調方法並不是全授權或全拒絕時才會響應,只要有權限被用戶授權,那么就會走onPermissionsGranted,對於onPermissionsDenied也是一樣的

  5. 權限被拒絕時重復申請

    在某些情況下,如果沒有某些權限,您的應用將無法正常運行 如果用戶使用“永不再問”選項拒絕這些權限,則您將無法向用戶請求這些權限,並且必須在應用設置中更改這些權限。EasyPermissions.somePermissionPermanentlyDenied(...)在這種情況下,您可以使用該方法向用戶顯示對話框,並將其引導至您的應用程序的系統設置屏幕:

    @Override
    public void onPermissionsDenied(int requestCode, List<String> perms) {
        Log.d(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size());
    
        // (Optional) Check whether the user denied any permissions and checked "NEVER ASK AGAIN."
        // This will display a dialog directing them to enable the permission in app settings.
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
            new AppSettingsDialog.Builder(this).build().show();
        }
    }
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
            // Do something after user returned from app settings screen, like showing a Toast.
            Toast.makeText(this, R.string.returned_from_app_settings_to_activity, Toast.LENGTH_SHORT)
                    .show();
        }
    }

     

  • 總結

  文章開頭提到由於使用AndPermission時遭遇了一種奇怪的現象,尋找解決辦法而不得,才去了解easypermissions的,希望能夠解決問題.替換運行時權限申請框架為easypermissions時,程序如願崩潰了,我總算是看到了異常信息,解決掉之后,完美運行.

另外,我不打算換回AndPermission了,哈哈哈...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM