android6.0运行时权限完美封装

前几天看了郭大神的运行时权限的专讲,深受启发,由于现在基于目前项目中的运行时权限封装的还不是那么完美,趁着郭神建议的还是历历在目。于是把它完整的敲了下来。并在此基础上添加上自己的一些见解,封装成一个完整的demo,希望与大家进行交流与。


在这里我进行了简单的在activity中简单进行获取权限和工具类封:


某一个权限被禁止或者是所有的权限被禁止,这里我做了去到烯烃界面去设置的处理: 


如果要开启多个权限的话,则可能不同的手机显示的效果不同,有些手机在权限Dialog上显示需要获取权限的个数,但有些手机需要多少个权限显示多少个。

最后一步处理:如果某个权限被禁止的话,则到设置界面去提示用户去打开权限:


部分代码:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 类功能描述:在activity中进行检测权限的简单方法 </br> 
  3.  * 博客地址:http://blog.csdn.net/androidstarjack 
  4.  * @author 老于 
  5.  * @version 1.0 </p> 修改时间:</br> 修改备注:</br> 
  6.  */  
  7. public class CheckPermissionOnActivity extends AppCompatActivity {  
  8.   
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.activity_checkpermission1);  
  13.         ButterKnife.bind(this);  
  14.     }  
  15.     @OnClick({R.id.btn_runtimne_onClick, R.id.btn_runtimne_onClick_multify,R.id.btn_runtimne_onClick_seting})  
  16.     public void onMyListener(View v){  
  17.         switch (v.getId()){  
  18.             case R.id.btn_runtimne_onClick:  
  19.                 requestToUserPersiom(1);  
  20.                 break;  
  21.             case R.id.btn_runtimne_onClick_multify:  
  22.                 requestToUserPersiom(2);  
  23.                 break;  
  24.             case R.id.btn_runtimne_onClick_seting:  
  25.                 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  
  26.                 intent.setData(Uri.parse("package:"+ getPackageName()));  
  27.                 startActivity(intent);  
  28.                 break;  
  29.         }  
  30.     }  
  31.     public void requestToUserPersiom(int permisionIndexCount){  
  32.         switch (permisionIndexCount){  
  33.             case 1:  
  34.                 ActivityCompat.requestPermissions(CheckPermissionOnActivity.thisnew String[]{android.Manifest.permission.CALL_PHONE},100);//去请求权限  
  35.                 break;  
  36.             case 2:  
  37.             case 3:  
  38.             case 4:  
  39.                 ActivityCompat.requestPermissions(CheckPermissionOnActivity.thisnew String[]{android.Manifest.permission.CALL_PHONE,android.Manifest.permission.WRITE_EXTERNAL_STORAGE},100);  
  40.                 break;  
  41.   
  42.         }  
  43.     }  
  44.   
  45.     @Override  
  46.     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {  
  47.         super.onRequestPermissionsResult(requestCode, permissions, grantResults);  
  48.         if(requestCode == 100){  
  49.             if(grantResults.length >0 ){  
  50.                 for (int i = 0; i < grantResults.length; i++) {  
  51.                     if( grantResults[i] == PackageManager.PERMISSION_DENIED){//拒绝啦  
  52.                         return ;  
  53.                     }  
  54.                 }  
  55.                 doosmething();  
  56.             }  
  57.         }  
  58.     }  
  59.   
  60.     /** 
  61.      * 做其他事情 
  62.      */  
  63.     public void doosmething(){  
  64.         GetToast.useString(CheckPermissionOnActivity.this,"开始做其他事情了");  
  65.     }  
  66. }  
封装成BaseActivitgy工具类:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class BasePermisitionActivity extends Activity {  
  2.   
  3.     private static final int REQUESTPERMISSION_CODE = 100;  
  4.     private static QuestPermissionListener questPermissionListener;  
  5.     private AlertDialog.Builder builder;  
  6.     private AlertDialog alertDialog;  
  7.   
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         ActivityManager.addPermissionActivty(this);  
  11.     }  
  12.   
  13.     public static  void requestRuntimePermission(String [] permissions,QuestPermissionListener questPermissionListener){  
  14.         Activity actyivty = ActivityManager.permissionActivilyList.get(ActivityManager.permissionActivilyList.size() -1);  
  15.         if(actyivty == null){  
  16.             return;  
  17.         }  
  18.         List<String> neetRequestPermisList  = new ArrayList<String>();  
  19.         for (String permission : permissions) {  
  20.             if(ActivityCompat.checkSelfPermission(actyivty,permission) == PackageManager.PERMISSION_DENIED){  
  21.                 neetRequestPermisList.add(permission);  
  22.             }  
  23.         }  
  24.         BasePermisitionActivity.questPermissionListener  = questPermissionListener;  
  25.         if(!neetRequestPermisList.isEmpty()){  
  26.             ActivityCompat.requestPermissions(actyivty,neetRequestPermisList.toArray(new String[neetRequestPermisList.size()]),REQUESTPERMISSION_CODE);  
  27.         }  
  28.     }  
  29.   
  30.     @Override  
  31.     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {  
  32.         super.onRequestPermissionsResult(requestCode, permissions, grantResults);  
  33.         if(requestCode == REQUESTPERMISSION_CODE){  
  34.             for (int i = 0; i < grantResults.length; i++) {  
  35.                 int granrRequest = grantResults[i];  
  36.                 if(granrRequest == PackageManager.PERMISSION_DENIED){//权限被拒绝啦  
  37.                     if(questPermissionListener != null){  
  38.                         questPermissionListener.denySomePermission();  
  39.                     }  
  40.                         return;  
  41.                 }  
  42.             }  
  43.             questPermissionListener.doAllPermissionGrant();  
  44.         }  
  45.     }  
  46.   
  47.     @Override  
  48.     protected void onResume() {  
  49.         super.onResume();  
  50.   
  51.     }  
  52.   
  53.   
  54.     public void onResumeCheckPermission(String ...permission){  
  55.         if(PermisionControl.lackMissPermission(this,permission)){  
  56.             showMissPermissionDialog();  
  57.         }  
  58.     }  
  59.   
  60.   
  61.     @Override  
  62.     protected void onDestroy() {  
  63.         super.onDestroy();  
  64.         ActivityManager.removePermissionActiivty(this);  
  65.     }  
  66.     /** 
  67.      * 丢失权限,进行弹框设置 
  68.      */  
  69.     public void showMissPermissionDialog() {  
  70.         if (builder == null) {  
  71.             builder = new AlertDialog.Builder(BasePermisitionActivity.this);  
  72.             builder.setTitle("帮助");  
  73.             String msg = "当前应用缺少必要权限。<br>\r请点击\"设置\"-\"权限\"-打开所需权限。<br>\r\r最后点击两次后退按钮,即可返回。";  
  74.             builder.setMessage(Html.fromHtml(msg));  
  75.             //materialDialog.setMovementMethod(LinkMovementMethod.getInstance());  
  76.             builder.setPositiveButton("设置"new DialogInterface.OnClickListener() {  
  77.                 @Override  
  78.                 public void onClick(DialogInterface dialog, int which) {  
  79.                     alertDialog.dismiss();  
  80.                 }  
  81.             });  
  82.             builder.setNegativeButton("退出"new DialogInterface.OnClickListener() {  
  83.                 @Override  
  84.                 public void onClick(DialogInterface dialog, int which) {  
  85.                     alertDialog.dismiss();  
  86.                     startAppSettings();  
  87.                 }  
  88.             });  
  89.             alertDialog = builder.create();  
  90.             alertDialog.show();  
  91.         } else {  
  92.             alertDialog.show();  
  93.         }  
  94.     }  
  95.     // 启动应用的设置  
  96.     public void startAppSettings() {  
  97.         try {  
  98.             Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  
  99.             intent.setData(Uri.parse("package:"+ getPackageName()));  
  100.             startActivity(intent);  
  101.         } catch (Exception e) {  
  102.             e.printStackTrace();  
  103.         }  
  104.     }  
  105. }  

与其相关的工具类:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 类功能描述:6.0运行时权限 </br> 
  3.  * permission权限控制器</br> 
  4.  * 博客地址:http://blog.csdn.net/androidstarjack 
  5.  * @author 老于 
  6.  * Created  on 2017/1/3/002 
  7.  * @version 1.0 </p> 修改时间:</br> 修改备注:</br> 
  8.  */  
  9. public class PermisionControl {  
  10.     /** 
  11.      * 检查所有的权限是否被禁止 
  12.      */  
  13.     public static boolean lackMissPermission(Context cnt ,String... permission){  
  14.         boolean relust = true ;  
  15.         for (String per : permission) {  
  16.             if(ActivityCompat.checkSelfPermission(cnt,per) == PackageManager.PERMISSION_DENIED){  
  17.                 relust = false ;  
  18.                 break;  
  19.             }  
  20.         }  
  21.         return relust;  
  22.     }  
  23.   
  24.     /** 
  25.      * 请求运行时权限 
  26.      * eg: 
  27.      */  
  28.     public void requestRuntimePermission(QuestPermissionListener questPermissionListener, String... permissions){  
  29.         BasePermisitionActivity.requestRuntimePermission(permissions,questPermissionListener);  
  30.     }  
  31. }  

以及其他的一些封装:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class PermissionUsage {  
  2.     /**********权限:打电话,写入内存卡,定位********/  
  3.     public static String[] LOACATION_CAMERA = { Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CALL_PHONE,  
  4.             Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_EXTERNAL_STORAGE};  
  5.     /**********权限:读取内存卡********/  
  6.     public static String[] READ_EXTRASORE = { Manifest.permission.READ_EXTERNAL_STORAGE};  
  7.     /**********权限:打电话权限********/  
  8.     public static String[] RCALL_PHONE = { Manifest.permission.READ_EXTERNAL_STORAGE};  
  9. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值