文章鏈接: "https://mp.weixin.qq.com/s/H63Sn03xV0JoINXB4SWWKA" 眾所周知,在android 6.0之後,如果應用程式需要危險許可權,則用戶必須明確嚮應用授予該許可權。今天推薦一個許可權相關的庫EasyPermissions。 以相機許可權來看,先看下不使用 ...
眾所周知,在android 6.0之後,如果應用程式需要危險許可權,則用戶必須明確嚮應用授予該許可權。今天推薦一個許可權相關的庫EasyPermissions。
以相機許可權來看,先看下不使用庫的情況下的授權方式。
通過ContextCompat.checkSelfPermission()
去判斷有沒有許可權的,沒有ActivityCompat.requestPermissions()
去請求許可權,有的話則直接調用拍照的
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()
來獲取回調結果。
@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();
}
}
使用EasyPermissions 來請求許可權
依舊以拍照舉例
同樣需要在重寫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)
用於檢查許可權是否授權,第二個參數可傳多個許可權值。
EasyPermissions.requestPermissions(context,String rationale,int requestCode,String... perms)
用於請求許可權,rationale 是提示文字,requestCode 請求碼,最後是多個許可權值。
這裡使用了@AfterPermissionGranted
註解。
@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
重寫兩個方法回調。
/**
* 允許許可權成功後觸發
*/
@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來直接執行許可權允許後的代碼。
...
if (EasyPermissions.hasPermissions(this, perms)) {
//加了@AfterPermissionGranted,授權成功後偶直接執行裡面代碼
}
...
不需要在許可權成功回調中再去執行代碼,簡化了流程。
EasyPermissions 庫地址https://github.com/googlesamples/easypermissions
歡迎關註我的個人博客:https://www.manjiexiang.cn/
更多精彩歡迎關註微信號:春風十里不如認識你
一起學習,一起進步,歡迎上車,有問題隨時聯繫,一起解決!!!