http://blog.csdn.net/qq_34767498/article/details/51814669
Android 6.0 运行时权限简洁封装
写在前面:
Android M 中有一个比较重要的知识点就是运行时权限了,关于运行时权限的文章和封装库目前也出现了不少,在开发的过程中始终觉得运行时权限这块的代码可以进一步封装一下,让其使用起来能再简洁一点,并且还不容易出错。关于 Android 运行时权限的知识就不多讲解了,可以参考下面的一些资料:
知识点比较简单,大致了解和使用过后,就来开始我的这次封装之旅吧。
现在直观的看看封装之后的使用,是不是清爽很多?
@OnClick(R.id.tv_toolbar_right)publicvoidonClick(){ performRequestPermissions(getString(R.string.permission_desc),newString[]{Manifest.permission.READ_PHONE_STATE, Manifest.permission.ACCESS_COARSE_LOCATION} , PER_REQUEST_CODE,newPermissionsResultListener() {@OverridepublicvoidonPermissionGranted(){ Toast.makeText(MainActivity.this,"已申请权限", Toast.LENGTH_LONG).show(); }@OverridepublicvoidonPermissionDenied(){ Toast.makeText(MainActivity.this,"拒绝申请权限", Toast.LENGTH_LONG).show(); } }); }
我将运行时权限封装到 BaseActivity 中,MainActivty 继承BaseActivity,调用 performRequestPermissions 方法,此时我不用再去做一些判断,只需要穿入四个参数即可。当然你为了在 6.0 以下保证应用正常运行,你依然需要像以前一样,在清单文件中申明要使用的权限。
首先我需要一个接口做通信:
publicinterfacePermissionsResultListener{voidonPermissionGranted();voidonPermissionDenied();}
然后把逻辑代码封装在 BaseActivity 里面:
publicclassBaseActivityextendsAppCompatActivity{privatePermissionsResultListener mListener;privateintmRequestCode;/** * 其他 Activity 继承 BaseActivity 调用 performRequestPermissions 方法 * *@paramdesc 首次申请权限被拒绝后再次申请给用户的描述提示 *@parampermissions 要申请的权限数组 *@paramrequestCode 申请标记值 *@paramlistener 实现的接口 */protectedvoidperformRequestPermissions(String desc, String[] permissions,intrequestCode, PermissionsResultListener listener){if(permissions ==null|| permissions.length ==0) {return; } mRequestCode = requestCode; mListener = listener;if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if(checkEachSelfPermission(permissions)) {// 检查是否声明了权限requestEachPermissions(desc, permissions, requestCode); }else{// 已经申请权限if(mListener !=null) { mListener.onPermissionGranted(); } } }else{if(mListener !=null) { mListener.onPermissionGranted(); } } }/** * 申请权限前判断是否需要声明 * *@paramdesc *@parampermissions *@paramrequestCode */privatevoidrequestEachPermissions(String desc, String[] permissions,intrequestCode){if(shouldShowRequestPermissionRationale(permissions)) {// 需要再次声明showRationaleDialog(desc, permissions, requestCode); }else{ ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode); } }/** * 弹出声明的 Dialog * *@paramdesc *@parampermissions *@paramrequestCode */privatevoidshowRationaleDialog(String desc,finalString[] permissions,finalintrequestCode){finalAlertDialog.Builder builder =newAlertDialog.Builder(this); builder.setTitle(getString(R.string.tips)) .setMessage(desc) .setPositiveButton(getResources().getString(R.string.confrim),newDialogInterface.OnClickListener() {@OverridepublicvoidonClick(DialogInterface dialogInterface,inti){ ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode); } }) .setNegativeButton(getResources().getString(R.string.cancle),newDialogInterface.OnClickListener() {@OverridepublicvoidonClick(DialogInterface dialogInterface,inti){ dialogInterface.dismiss(); } }) .setCancelable(false) .show(); }/** * 再次申请权限时,是否需要声明 * *@parampermissions *@return*/privatebooleanshouldShowRequestPermissionRationale(String[] permissions){for(String permission : permissions) {if(ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {returntrue; } }returnfalse; }/** * 检察每个权限是否申请 * *@parampermissions *@returntrue 需要申请权限,false 已申请权限 */privatebooleancheckEachSelfPermission(String[] permissions){for(String permission : permissions) {if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {returntrue; } }returnfalse; }/** * 申请权限结果的回调 * *@paramrequestCode *@parampermissions *@paramgrantResults */@OverridepublicvoidonRequestPermissionsResult(intrequestCode, @NonNull String[] permissions, @NonNullint[] grantResults){super.onRequestPermissionsResult(requestCode, permissions, grantResults);if(requestCode == mRequestCode) {if(checkEachPermissionsGranted(grantResults)) {if(mListener !=null) { mListener.onPermissionGranted(); } }else{// 用户拒绝申请权限if(mListener !=null) { mListener.onPermissionDenied(); } } } }/** * 检查回调结果 * *@paramgrantResults *@return*/privatebooleancheckEachPermissionsGranted(int[] grantResults){for(intresult : grantResults) {if(result != PackageManager.PERMISSION_GRANTED) {returnfalse; } }returntrue; }}
每一个方法都有注释,逻辑也相对简单,就是我会遍历每个数组中申请的权限,如果需要申请就去申请,然后再处理一下回调的结果,其中还有对用户拒绝,然后再次申请弹出 Dialog 的处理。
如果在 Fragment 中使用,只是改变了一下参数封到 BaseFragment 中,这里就不贴代码了,都已经上传github
BaseActivity:
BaseFragment:
如有问题,继续交流~