关于android权限的一些处理

移动开发 waitig 539℃ 百度已收录 0评论

Android6.0之后,对于权限有了新的要求,有些权限需要你在使用场景的时候去设置开启,但是有些手机权限设置会有点问题。我目前使用的是小米手机进行测试,发现当你第一次拒绝了权限后,再次去请求开启的时候,是没有反应的,这个时候就要去跳转到系统设置里面去了,但是小米的权限设置有两个地方,要单独的根据手机型号去判断跳转。我身边只有一部小米手机系统是7.0的,其他手机都是4.4、5.0左右的,所以没有针对其他手机去进行测试。下面就是一些权限判断方法,如果差错,请指正。

首先是去循环便利出你要申请的权限是否开启 , 只对23以及以上进行操作,如果申请了,直接回调回去进行操作,没有申请,进行下一步。

   /**
     * 其他 Activity 继承 BaseActivity 调用 performRequestPermissions 方法
     *
     * @param desc        首次申请权限被拒绝后再次申请给用户的描述提示
     * @param permissions 要申请的权限数组
     * @param requestCode 申请标记值
     * @param listener    实现的接口
     */
    private int mRequestCode;
    public void performRequestPermissions(String desc, String[] permissions, int    requestCode,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();
            }
        }
    }
 /**
     * 这个是检察每个权限是否申请的方法
     *
     * @param permissions
     * @return true 需要申请权限,false 已申请权限
     */
    private boolean checkEachSelfPermission(String[] permissions) {
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                return true;
            }
        }
        return false;
    }
/**
     * 申请权限前判断是否需要声明
     *,如果需要,就直接弹出框给他,进行选择申请还是拒绝,不需要就直接去申请权限,申请结果会在*ActivityResult中返回回来
     * @param desc
     * @param permissions
     * @param requestCode
     */
    private void requestEachPermissions(String desc, String[] permissions, int requestCode) {
        if (shouldShowRequestPermissionRationale(permissions)) {// 需要再次声明
            showRationaleDialog(desc, permissions, requestCode);
        } else {
            ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode);
        }
    }



  /**
     * 接着就是弹出声明的 Dialog
     *
     * @param desc
     * @param permissions
     * @param requestCode
     */
    private void showRationaleDialog(String desc, final String[] permissions, final int requestCode) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle(getString(R.string.permission_request_dialog_tips))
                .setMessage(desc)
                .setPositiveButton(getResources().getString(R.string.permission_request_dialog_confirm), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                    //选择确定的话,就去申请开启权限
                        ActivityCompat.requestPermissions(BaseActivity.this, permissions, requestCode);
                    }
                })
                .setNegativeButton(getResources().getString(R.string.permission_request_dialog_cancel), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                    //取消的话就直接关闭
                        dialogInterface.dismiss();
                    }
                })
                .setCancelable(false)
                .show();
    }


 /**
     * 然后就是申请权限结果的返回
     *当调用requestPermissions,测试小米手机如果是拒绝状态,不会有弹窗提示,就直接失败了,然后需要去**手动设置
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == mRequestCode) {
            if (checkEachPermissionsGranted(grantResults)) {
                if (mListener != null) {
                    mListener.onPermissionGranted();
                }
            } else {// 用户拒绝申请权限
                if (mListener != null) {
                    mListener.onPermissionDenied();
                }
            }
        }
    }

    /**
     * 检查回调结果
     *
     * @param grantResults
     * @return
     */
    private boolean checkEachPermissionsGranted(int[] grantResults) {
        for (int result : grantResults) {
            if (result != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

接下来就是在请求失败的时候,去跳转到设置权限的界面了
这边使用的是mvp,然后需要自己去提取一个方法进行设置

   //    动态申请权限
    @Override
    public void locationPermission() {
        String[] permissions = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION};
        performRequestPermissions("需要您的定位权限!", permissions, 0, new PermissionsResultListener() {
            @Override
            public void onPermissionGranted() {
                Log.i("ysh", "定位权限开启");
                //进行下一步操作
            }

            @Override
            public void onPermissionDenied() {
                Log.i("ysh", "定位权限未开启");
                //权限申请失败,直接跳转到设置界面,在里面去判断是否是其他机型
                JurisdictionSetUtil.startJuSetIntent(getActivity());
            }
        });
    }

//过后我有一个疑问,就是是在设置权限之前就去判断机型,然后根据机型去判断权限是否开启,就不用再点击回来后再进行判断设置了。不知道哪一种更好一点

/**

//这个变量是用来判断是否是跳转到了设置权限的界面回来,如果是的话,在跳转界面的OnResume里面去判断是否等于2,如果是的,就说明是设置返回的。但是有一个问题就是,我返回回来之后,我是不知道他到底有没有确定的,所以需要再去判断他要开启的权限是否开启
   public static int isSetJuset = 0;

    public static void startJuSetIntent(Context context) {
        Intent localIntent = new Intent();
        localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= 9) {
            if (GetSystemUti.getSystem().equals(GetSystemUti.SYS_MIUI)) {
                //如果是小米系统,这边就要跳转到小米的权限开启界面,使用下面一种设置界面,开启了也无效
                Intent intent = new Intent();
                intent.setAction("miui.intent.action.APP_PERM_EDITOR");
                intent.addCategory(Intent.CATEGORY_DEFAULT);
                intent.putExtra("extra_pkgname", context.getPackageName());
                context.startActivity(intent);

            } else {
                localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
                localIntent.setData(Uri.fromParts("package", context.getPackageName(), null));
                context.startActivity(localIntent);
            }
        } else if (Build.VERSION.SDK_INT <= 8) {
            localIntent.setAction(Intent.ACTION_VIEW);
            localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
            localIntent.putExtra("com.android.settings.ApplicationPkgName", context.getPackageName());
            context.startActivity(localIntent);
        }
        isSetJuset = 2;
    }

本文由【waitig】发表在等英博客
本文固定链接:关于android权限的一些处理
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)