安卓6.0前后权限申请

安卓6.0之后改动较大,其中权限方面就对我们的app开发有较大的影响,甚至会直接导致app的崩溃,这是因为android 6.0以后新增了运行时权限机制,下面是我参看多方播客后结合自己的开发所采用的解决方案

注:应首先在AndroidManifest.xml中申明所需的权限,这里就不多做说明了

    //同时申请多个权限
    public void applyPermission(){
        //需要申请的权限的列表
        String[] mutiPermissions = new String[]{
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.ACCESS_FINE_LOCATION,};

        //需要请求授权的权限
        ArrayList<String> needRequest = new ArrayList<>();

        //遍历 过滤已授权的权限,防止重复申请
        for (String permission : mutiPermissions) {
            int check = 0;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                check = checkSelfPermission(permission);
            }
            if (check != PackageManager.PERMISSION_GRANTED) {
                needRequest.add(permission);
                Log.d("RuntimePermissionDemo","needCheck: " + permission);
            }
        }

        //如果没有全部授权
        if (needRequest.size() > 0) {
            //请求权限,此方法异步执行,会弹出权限请求对话框,让用户授权,并回调 onRequestPermissionsResult 来告知授权结果
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {    //判断android 版本
                requestPermissions(needRequest.toArray(new String[needRequest.size()]), REQUEST_CODE_ASK_MUTI_PERMISSIONS);
            }

        }else {
         //已经全部授权了
        }
    }
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_ASK_SINGLE_PERMISSION://请求单个权限
                //...
                break;
            case REQUEST_CODE_ASK_MUTI_PERMISSIONS://请求多个权限
                if (grantResults.length > 0) {
                    //被拒绝的权限列表
                    ArrayList<String> deniedPermissions = new ArrayList<>();

                    for (int i=0; i<grantResults.length; i++) {
                        if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                            deniedPermissions.add(permissions[i]);
                            Log.d("RuntimePermissionDemo", "Denied Permission: " + permissions[i]);
                        }
                    }
                    if (deniedPermissions.size() <= 0) {
                        //已经全部授权
                    }else {//没有全部授权
                        Toast.makeText(TEMainActivity.this, "缺少部分权限", Toast.LENGTH_SHORT).show();

                        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {

                            //需要引导用户手动开启的权限列表
                            ArrayList<String> needShow = new ArrayList<>();

                            //从没有授权的权限中判断是否需要引导用户
                            for (int i=0; i<deniedPermissions.size(); i++) {
                                String permission = deniedPermissions.get(i);
                                if (!shouldShowRequestPermissionRationale(permission)) {
                                    needShow.add(permission);
                                    Log.d("RuntimePermissionDemo", "needShow: " + permission);
                                }
                            }

                            //需要引导用户
                            if (needShow.size() > 0) {
                                //需要弹出自定义对话框,引导用户去应用的设置界面手动开启权限
                                showMissingPermissionDialog();
                            }
                        }
                    }
                }
                break;
            default: super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

    /**
     * 需要手动开启缺失的权限对话框
     */
    private void showMissingPermissionDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("提示");
        builder.setMessage("当前应用权限不足。\n\n可点击\"设置\"-\"权限\"-打开所需权限。\n\n最后点击两次后退按钮,即可返回。");
        builder.setNegativeButton("知道了", null);
        builder.setPositiveButton("设置", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                startAppSettings();
            }
        });
        builder.setCancelable(false);
        builder.show();
    }


猜你喜欢

转载自blog.csdn.net/bayijungong/article/details/80619509