文章連接: https://mp.weixin.qq.com/s/H63Sn03xV0JoINXB4SWWKA
衆所周知,在android 6.0以後,若是應用程序須要危險權限,則用戶必須明確嚮應用授予該權限。今天推薦一個權限相關的庫EasyPermissions。 android
以相機權限來看,先看下不使用庫的狀況下的受權方式。
經過ContextCompat.checkSelfPermission()
去判斷有沒有權限的,沒有ActivityCompat.requestPermissions()
去請求權限,有的話則直接調用拍照的git
private void requestPermission() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { //權限判斷,沒有就去請求所需權限,傳參 須要申請的權限(能夠多個), requestCode請求碼用於結果回調裏判斷 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, PERMISSIONS_REQUEST_CODE); }else { //有權限直接拍照,6.0如下的手機拍照走這裏 takePhoto(); } } private void takePhoto(){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivity(intent); }
調用requestPermissions()
方法後須要在Activity中重寫onRequestPermissionsResult()
來獲取回調結果。github
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (PERMISSIONS_REQUEST_CODE == requestCode) { for (int x : grantResults) { if (x == PackageManager.PERMISSION_DENIED) { //權限拒絕了 return; } } takePhoto(); } }
依舊以拍照舉例
一樣須要在重寫onRequestPermissionsResult()
,這裏就直接將請求結果傳遞EasyPermission 來處理。微信
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); }
EasyPermissions.hasPermissions(Context context,String... perms)
用於檢查權限是否受權,第二個參數可傳多個權限值。 ide
EasyPermissions.requestPermissions(context,String rationale,int requestCode,String... perms)
用於請求權限,rationale 是提示文字,requestCode 請求碼,最後是多個權限值。 學習
這裏使用了@AfterPermissionGranted
註解。this
@AfterPermissionGranted(PERMISSIONS_REQUEST_CODE) private void requestPermission(){ String[] perms = {Manifest.permission.CAMERA}; //權限判斷,第一次彈出系統的受權提示框 if (EasyPermissions.hasPermissions(this, perms)) { //@AfterPermissionGranted 有權限直接執行 todo... }else { //沒有權限的話,先提示,點肯定後彈出系統的受權提示框 EasyPermissions.requestPermissions(this, "拍照過程須要用到相機權限", PERMISSIONS_REQUEST_CODE, perms); } }
EasyPermissions 庫提供了權限請求的回調,activity實現 EasyPermissions.PermissionCallbacks
重寫兩個方法回調。google
/** * 容許權限成功後觸發 */ @Override public void onPermissionsGranted(int requestCode, List<String> perms) { } /** * 禁止權限後觸發 */ @Override public void onPermissionsDenied(int requestCode, List<String> perms) { if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { //在權限彈窗中,用戶勾選了'不在提示'且拒絕權限的狀況觸發,能夠進行相關提示。 } }
使用@AfterPermissionGranted
註解,當權限請求被用戶容許後,會根據requestCode來直接執行權限容許後的代碼。spa
... if (EasyPermissions.hasPermissions(this, perms)) { //加了@AfterPermissionGranted,受權成功後偶直接執行裏面代碼 } ...
不須要在權限成功回調中再去執行代碼,簡化了流程。
EasyPermissions 庫地址https://github.com/googlesamples/easypermissions code
歡迎關注個人我的博客:https://www.manjiexiang.cn/
更多精彩歡迎關注微信號:春風十里不如認識你
一塊兒學習,一塊兒進步,歡迎上車,有問題隨時聯繫,一塊兒解決!!!