標籤:管理 自己 ack denied com 選擇 重疊 檢查 over
Android6.0採用新的許可權模型,只有在需要許可權的時候,才告知使用者是否授權,是在runtime時候授權,而不是在原來安裝的時候 ,同時預設情況下每次在運行時開啟頁面時候,需要先檢查是否有所需要的許可權申請。這樣的使用者的自主性提高很多,比如使用者可以給APP賦予攝像的許可權,但是可以拒絕記錄裝置位置的許可權,就是怕位置資訊上傳等等。
1.一個簡單的許可權封裝類
首先定義一個工具類,判斷是否缺少許可權:
//檢查許可權時,判斷系統的許可權集合 public boolean permissionSet(String... permissions) { for (String permission : permissions) { if (isLackPermission(permission)) {//是否添加完全部許可權集合 return true; } } return false; } //檢查系統許可權是,判斷當前是否缺少許可權(PERMISSION_DENIED:許可權是否足夠) private boolean isLackPermission(String permission) { return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_DENIED; }
建立一個baseActivity做封裝
//首先聲明許可權授權 public static final int PERMISSION_DENIEG = 1;//許可權不足,許可權被拒絕的時候 public static final int PERMISSION_REQUEST_CODE = 0;//系統授權管理頁面時的結果參數 public static final String PACKAGE_URL_SCHEME = "package:";//許可權方案 public CheckPermission checkPermission;//檢測權限類別的許可權檢測器 private boolean isrequestCheck = true;//判斷是否需要系統許可權檢測。防止和系統提示框重疊 public abstract int initContentID(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initContentID(); process(savedInstanceState); } //顯示對話方塊提示使用者缺少許可權 public void showMissingPermissionDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.help);//提示協助 builder.setMessage(R.string.string_help_text); //如果是拒絕授權,則退出應用 //退出 builder.setNegativeButton(R.string.quit, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); //開啟設定,讓使用者選擇開啟許可權 builder.setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { startAppSettings();//開啟設定 } }); builder.setCancelable(false); builder.show(); } //擷取全部許可權 public boolean hasAllPermissionGranted(int[] grantResults) { for (int grantResult : grantResults) { if (grantResult == PackageManager.PERMISSION_DENIED) { return false; } } return true; } //開啟系統應用設定(ACTION_APPLICATION_DETAILS_SETTINGS:系統設定許可權) public void startAppSettings() { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName())); startActivity(intent); } //請求許可權去相容版本 public void requestPermissions(String... permission) { ActivityCompat.requestPermissions(this, permission, PERMISSION_REQUEST_CODE); } /** * 用於許可權管理 * 如果全部授權的話,則直接通過進入 * 如果許可權拒絕,缺失許可權時,則使用dialog提示 * * @param requestCode 請求代碼 * @param permissions 許可權參數 * @param grantResults 結果 */ @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (PERMISSION_REQUEST_CODE == requestCode && hasAllPermissionGranted(grantResults)) //判斷請求碼與請求結果是否一致 { isrequestCheck = true;//需要檢測許可權,直接進入,否則提示對話方塊進行設定 getAllGrantedPermission(); } else { //提示對話方塊設定 isrequestCheck = false; showMissingPermissionDialog();//dialog } } /* * 當擷取到要求的權限後,進行相關業務操作 */ public void getAllGrantedPermission() { } protected void process(Bundle savedInstanceState) { if (getPermissions() != null) { checkPermission = new CheckPermission(this); if (checkPermission.permissionSet(getPermissions())) { requestPermissions(getPermissions()); //去請求許可權 } else { getAllGrantedPermission(); } } } @Override protected void onResume() { super.onResume(); //根據activity生命週期,onRestart()->onResume() //此處表示從系統設定頁面返回後,檢查使用者是否將所需的許可權開啟 if (!isrequestCheck) { if (getPermissions() != null) { if (checkPermission.permissionSet(getPermissions())) { showMissingPermissionDialog();//dialog } else { //擷取全部許可權,走正常業務 getAllGrantedPermission(); } } } else { isrequestCheck = true; } } public String[] getPermissions() { return null; }
在自己的activity中,重寫以下幾個方法
static final String[] PERMISSION = new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE,// 寫入許可權 Manifest.permission.READ_EXTERNAL_STORAGE, //讀取許可權 Manifest.permission.READ_PHONE_STATE, //讀取裝置資訊 Manifest.permission.ACCESS_COARSE_LOCATION, //百度定位 Manifest.permission.ACCESS_FINE_LOCATION, }; //布局id上送到BaseActivity @Override public int initContentID() { return R.layout.activity_main; } @Override protected void process(Bundle savedInstanceState) { super.process(savedInstanceState); //如果有什麼需要初始化的,在這裡寫就好~ } @Override public void getAllGrantedPermission() { //當擷取到要求的權限後,進行相關業務操作 super.getAllGrantedPermission(); } @Override public String[] getPermissions() { return PERMISSION; }
Android6.0動態擷取許可權