Android:Android(安卓)6.0+权限适配--简单粗暴
16lz
2021-01-25
Android M之后开始了动态分配权限,而M之前的版本还是直接在AndroidManifest中直接声明就可以获得相应的权限,所以在适配高版本时要兼容低版本,仍需要在AndroidManifest声明所需权限。
接下来是在高版本中权限的使用:
首先在需要使用权限(拿定位权限举例)之前先判断当前系统的版本:
/*当系统版本大于Android M 时开始对权限的检查*/if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ //检查是否拥有定位权限 if(ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){ /*** * 没有授权,尝试获取权限。 * 1、第一次询问用户是否需要权限,弹出授权框。 * 2、以前被拒绝过,系统将不理会此程序的授权申请,弹出提示由用户自行处理。*/if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_COARSE_LOCATION)){ ActivityCompat.requestPermissions(HomeActivity.this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, 100); }else{ showPermissionDialog(HomeActivity.this,"定位权限"); } //权限处理结束,结束当前代码块。 return; } }dosth();//此处为获得权限的情况下继续执行业务逻辑。
关于shouldShowRequestPermissionRationale:
第一次请求权限时,用户拒绝了,下一次:shouldShowRequestPermissionRationale() 返回
true,应该显示一些为什么需要这个权限的说明第二次请求权限时,用户拒绝了,并选择了“不在提醒”的选项时:shouldShowRequestPermissionRationale()返回 false
- 设备的策略禁止当前应用获取这个权限的授权:shouldShowRequestPermissionRationale()
返回 false
目前api中给出的权限回调结果有两种:
PackageManager.PERMISSION_DENIED //权限被拒绝PackageManager.PERMISSION_GRANTED //拿到了权限
关于回调onRequestPermissionsResult:
是否需要处理回调取决于你的业务逻辑,针对我的定位问题感觉没必要处理回调,地图sdk中有对定位的监听,当定位发生改变后自然可以处理获得位置信息的一些列问题。
回调后要做的事情无非就是检查权限之前要做的事,当获得权限后继续执行代码,针对定位发现一个有趣的事情:当你把一个应用的定位权限由允许修改为禁止、询问后,再次回到应用会发现应用重启。(试过微信、微博也是同样的问题,打印log也不会有error出现……)
以上代码中提到的相关方法:
public static void showPermissionDialog(final Activity mActivity,String title){ HelperFromZhl.showSimpleDialogForPermission(mActivity, "权限申请", "请前往【应用程序设置】-【权限管理】,开启【"+title+"】,以正常使用应用程序!", "立即设置", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface anInterface, int i) { anInterface.dismiss(); //打开应用程序权限管理 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package",mActivity.getPackageName(), null); intent.setData(uri); // Start for result //noinspection NewApi The Builder constructor prevents this mActivity.startActivityForResult(intent, AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE); } }, "取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface anInterface, int i) { anInterface.dismiss(); } }); } /*** * 权限提醒 dialog * @param context * @param title * @param msg * @param conform * @param conformListener * @param cancle * @param cancleListener */ public static void showSimpleDialogForPermission(Context context, String title, String msg, String conform, DialogInterface.OnClickListener conformListener, String cancle, DialogInterface.OnClickListener cancleListener){ View view = LayoutInflater.from(context).inflate(R.layout.layout_pers_gps,null); TextView txt = (TextView) view.findViewById(R.id.lpg_txt_msg); txt.setText(Html.fromHtml(msg)); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(title) .setView(view) .setPositiveButton(conform,conformListener) .setNegativeButton(cancle,cancleListener) .setCancelable(false); AlertDialog dialog = builder.create(); Window dialogWindow = dialog.getWindow(); dialogWindow.setGravity(Gravity.CENTER); dialogWindow.setWindowAnimations(R.style.dialogstyle); // 添加动画 dialog.show(); dialog.getButton(dialog.BUTTON_NEGATIVE).setTextColor(Color.parseColor("#808080")); dialog.getButton(dialog.BUTTON_POSITIVE).setTextColor(Color.parseColor("#3881c5")); }
更多相关文章
- {Android} 测试Google Play In-App-Billing支付
- Android(安卓)App扫描二维码功能的实现
- 设计应用Logo Android(安卓)- Asset Studio Integration
- 使用VS2015调试Android的C++动态链接库
- Android发送短信、打电话、发送邮件的程序集合&&广播权限
- Kivy A to Z -- 如何从python代码中直接访问Android的Service
- Android(安卓)开发经验汇总
- Android(安卓)禁止安装没有授权的第三方应用
- Android官方开发文档Training系列课程中文版:高效显示位图之管理