Android 6.0 运行权限的问题

Android开发中当targetSDKVersion 的值大于22时候,就会涉及到运行时权限的问题。有的应用程序会在刚进入App的首页的时候弹出提示框让用户选择允许还是拒绝,有的应用程序会在需要这个权限的地方弹出提示框让用户选择,当用户选择允许的时候还好,但当用户选择拒绝的时候,当再次进入App或者某个页面的时候就不会再一次弹出提示框让用户选择,这就比较尴尬了,有的手机得不到某个权限的时候会导致App崩溃,例如getDeviceId的时候需要READ-PHONE_STATE这个权限,在vivo ,oppo,魅族的手机上是可以得到这个权限的,但在小米的机型上需要动态申请才可以得到。就会导致程序在小米的手机上不能兼容。下面说一下我的解决方法。

1.进入App或进入某个页面的onResume生命周期里先检查是否有这个权限。(这里以进入登录页面为例),没有这个权限的时候去申请这个权限弹出提示框。

2.弹出提示框后如果用户点击允许就可以结束这个逻辑了,万事大吉。

                           用户点击了拒绝后,继续操作在需要特殊权限的地方用try catch 语句处理,当走到catch里的时候弹出自己写的提示框,提示用户跳转到设置页面手动开启所需要的权限。

代码如下:

1.

@Override

    public void onResume() {

        super.onResume();

        //检查是否有读取手机信息的权限

        int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_PHONE_STATE);

        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {

            // 没有这个权限去请求

            requestReadPhonePermission();

        } else {

            //TODO

        }

    }

2.

private void requestReadPhonePermission() {

//shouldShowRequestPermissionRationale 这个方法是提示用户请求权限的理由

        if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), android.Manifest.permission.READ_PHONE_STATE)) {

            //在这里面处理需要权限的代码

        } else {

            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_PHONE_STATE}, 0);

        }

    }


    @Override

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        switch (requestCode) {

            case 0:

                if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {

                    //TODO

                    Log.i("fkajfk", "走了这个log");

                }

                break;


            default:

                break;

        }

    }


3.

    /**

     * 提示用户的 dialog

     */

    protected void showMissingPermissionDialog() {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        builder.setTitle("提示");

        builder.setMessage("当前应用缺少获取手机信息权限。\n\n请点击\"设置\"-\"权限管理\"-打开所需权限。");

        // 拒绝, 退出应用

        builder.setNegativeButton("取消",

                new DialogInterface.OnClickListener() {

                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                        Log.i("info", "8--权限被拒绝,此时不会再回调onRequestPermissionsResult方法");

                    }

                });

        builder.setPositiveButton("设置",

                new DialogInterface.OnClickListener() {

                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                        Log.i("info", "4,需要用户手动设置开启当前app设置界面");

                        startAppSettings();

                    }

                });

        builder.setCancelable(false);

        builder.show();

    }


4.

    /**

     * 打开     App设置界面

     */

    private void startAppSettings() {

        Intent intent = new Intent(

                Settings.ACTION_APPLICATION_DETAILS_SETTINGS);

        intent.setData(Uri.parse("package:" + getActivity().getPackageName()));

        startActivity(intent);

    }

5.//try catch 的异常里调用 showMissingPermissionDialog();

try {

         //正常做操作   

        }catch (Exception e){

            showMissingPermissionDialog();

        }

附上两张截图:

Android 6.0 运行权限的问题