Android6.0谷歌加強了對android權限機制等管理,對敏感權限要動態加載。為了便于管理動態權限,GitHub上出現了好多開發者封裝的動態權限管理庫,PermissionsDispatcher是github上面一個廣受大家喜愛的權限管理庫,做一下筆記方便自己以后使用(該庫支持小米手機)。
@RuntimePermissions
注冊Activity或Fragment來處理權限
@NeedsPermission
注解執行需要一個或多個權限的操作的方法(允許請求權限后,后面要執行的邏輯寫在這里)
@OnShowRationale
注解一個方法,解釋為什么需要許可。它傳入一個PermissionRequest對象,可以用于在用戶輸入時繼續或中止當前的權限請求(這里可以彈出一個對話框讓用戶點擊是否要允許該權限,如果點擊允許,則彈出權限對話框讓用戶選擇。)
@OnPermissionDenied
注釋如果用戶沒有授予權限,則調用該方法( 如果用戶沒有選擇:不再詢問,且拒絕了該權限,則會回調此注解的方法)
@OnNeverAskAgain
注解一個方法,如果用戶選擇讓設備“不再詢問”一個權限,則調用該方法(小米手機因為有自己的動態權限管理機制,拒絕權限后直接走了這個方法)
核心代碼示例:
@RuntimePermissions
public class MainActivity extends AppCompatActivity {
private static final int CODE_REQUEST_CAMERA_PERMISSIONS = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
findViewById (R.id.tv).setOnClickListener (new View.OnClickListener () {
@Override
public void onClick(View v) {
MainActivityPermissionsDispatcher.myNCamWithCheck (MainActivity.this);
}
});
}
@NeedsPermission(Manifest.permission.CAMERA)//允許請求權限后,后面要執行的邏輯寫在這里
void myNCam() {
Toast.makeText (this,"權限被允許,本邏輯可以執行了",Toast.LENGTH_LONG).show ();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult (requestCode, permissions, grantResults);
MainActivityPermissionsDispatcher.onRequestPermissionsResult (this, requestCode, grantResults);
}
@OnShowRationale(Manifest.permission.CAMERA)//這里可以彈出一個對話框讓用戶點擊是否要允許該權限,如果點擊允許,則彈出權限對話框讓用戶選擇
void mySCam(final PermissionRequest request) {
showRationaleDialog (R.string.permission_camera_rationale, request);
}
@OnPermissionDenied(Manifest.permission.CAMERA)//如果用戶沒有選擇:不再詢問,且拒絕了該權限,則會回調此注解的方法
void myDCam() {
Toast.makeText (this, R.string.permission_camera_denied, Toast.LENGTH_LONG).show ();
}
@OnNeverAskAgain(Manifest.permission.CAMERA)//如果用戶選擇讓設備“不再詢問”一個權限,則調用該方法
void myACam() {
Toast.makeText (this, R.string.permission_camera_never_askagain, Toast.LENGTH_SHORT).show ();
//對話框提示語句仿支付寶提示
final AlertDialog.Builder mDialog = new AlertDialog.Builder (this);
mDialog.setTitle ("獲取相機權限");
mDialog.setMessage ("我們需要獲取相機相關權限,用于拍照;否則,你將無法正常使用本應用\n設置路徑:設置->應用->xxx->權限");
mDialog.setNegativeButton ("取消", new DialogInterface.OnClickListener () {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
mDialog.create ().dismiss ();
}
});
mDialog.setPositiveButton ("去設置", new DialogInterface.OnClickListener () {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
settingPermissionActivity (MainActivity.this);
}
});
mDialog.show ();
}
private void showRationaleDialog(@StringRes int messageResId, final PermissionRequest request) {
new AlertDialog.Builder (this)
.setPositiveButton (R.string.button_allow, new DialogInterface.OnClickListener () {
@Override
public void onClick(@NonNull DialogInterface dialog, int which) {
request.proceed ();
}
})
.setNegativeButton (R.string.button_deny, new DialogInterface.OnClickListener () {
@Override
public void onClick(@NonNull DialogInterface dialog, int which) {
request.cancel ();
}
})
.setCancelable (false)
.setMessage (messageResId)
.show ();
}
public static void settingPermissionActivity(Activity activity) {
//判斷是否為小米系統
if (TextUtils.equals (BrandUtils.getSystemInfo ().getOs (), BrandUtils.SYS_MIUI)) {
Intent miuiIntent = new Intent ("miui.intent.action.APP_PERM_EDITOR");
miuiIntent.putExtra ("extra_pkgname", activity.getPackageName ());
//檢測是否有能接受該Intent的Activity存在
List<ResolveInfo> resolveInfos = activity.getPackageManager ().queryIntentActivities (miuiIntent, PackageManager.MATCH_DEFAULT_ONLY);
if (resolveInfos.size () > 0) {
activity.startActivityForResult (miuiIntent, CODE_REQUEST_CAMERA_PERMISSIONS);
return;
}
}
//如果不是小米系統 則打開Android系統的應用設置頁
Intent intent = new Intent (Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts ("package", activity.getPackageName (), null);
intent.setData (uri);
activity.startActivityForResult (intent, CODE_REQUEST_CAMERA_PERMISSIONS);
}
}
重點來了,可以用插件:PermissionsDispatcher plugin
上面代碼手動寫比較繁瑣 androidStudio里面有一個三方插件 可以自動生成注解方法。
在AndroidStudio 添加插件里面搜索:PermissionsDispatcher plugin 安裝重啟AS即可。
具體使用方法下面網址有詳細說明:
https://github.com/shiraji/permissions-dispatcher-plugin
PermissionsDispatcher GitHub地址:
https://github.com/permissions-dispatcher/PermissionsDispatcher