- 前言
之前使用過AndPermission權限申請庫,當開發者執行有權限的代碼發生異常時,AndPermission會抓到異常並回調到失敗中,這里要注意的是會抓到任何異常,不僅僅是沒有權限時的異常.
這使得我在正常授權的回調中的一些異常,甚至是崩潰的異常都被它捕捉了,因此導致了一個奇怪的現象:權限申請到了,但是彈出了我在onDenied()方法中的吐司...
那么,我當時是不知道是因為自己的邏輯出現了錯誤,導致這個現象的,所以到處去找解決辦法,去翻AndPermission的Issues和反復閱讀文檔,遺憾的是當時我並沒有主要到上面那句話...
於是,我就使用了另外一個權限申請庫,這就是接下來要講的easypermissions,它是googlesamples里的一個成員,因此是谷歌推薦的權限申請庫,放心大膽的使用吧.
- easypermissions使用步驟
- 依賴
dependencies { implementation 'pub.devrel:easypermissions:1.2.0' }請注意,EasyPermissions依賴於 Android Support Library
27.1.0因此你需要使用compileSdkVersion 27或更高版本。此更改應該是安全的,因為compileSdkVersion不會更改應用行為。 - 必要准備
在你的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); } }
- 申請權限
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對象,第一個參數是提示字符串,第三個參數是請求碼(可在回調中用來匹配),第四個參數是權限數組 } } - 回調
權限申請的回調有多種,上面只是其中一種,通過@AfterPermissionGranted(請求碼)的方式.
@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);
}
}此外,你還可以實現
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也是一樣的
- 權限被拒絕時重復申請
在某些情況下,如果沒有某些權限,您的應用將無法正常運行 如果用戶使用“永不再問”選項拒絕這些權限,則您將無法向用戶請求這些權限,並且必須在應用設置中更改這些權限。
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了,哈哈哈...
