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"));    }

更多相关文章

  1. {Android} 测试Google Play In-App-Billing支付
  2. Android(安卓)App扫描二维码功能的实现
  3. 设计应用Logo Android(安卓)- Asset Studio Integration
  4. 使用VS2015调试Android的C++动态链接库
  5. Android发送短信、打电话、发送邮件的程序集合&&广播权限
  6. Kivy A to Z -- 如何从python代码中直接访问Android的Service
  7. Android(安卓)开发经验汇总
  8. Android(安卓)禁止安装没有授权的第三方应用
  9. Android官方开发文档Training系列课程中文版:高效显示位图之管理

随机推荐

  1. Android预安装可卸载程序
  2. 自定义Dialog对话框
  3. Android Gradle Release Version 2.4 增
  4. Android之SurfaceView学习(一)
  5. android 使用zxing生成中间嵌套logo的二
  6. android捕获全局异常,CrashHandler
  7. 导入android自带通讯录报错
  8. 修复Android Studio 3.5 AIDL报错问题
  9. ntfs-3g 移植到android
  10. Android培训班(24)