Android 6.0动态获取权限,根据官方总结的最简单有效解决方法

Android 6.0官方提供的正常权限和危险权限描述

系统权限分为几个保护级别。需要了解的两个最重要保护级别是正常权限和危险权限:

  • 正常权限涵盖应用需要访问其沙盒外部数据或资源,但对用户隐私或其他应用操作风险很小的区域。例如,设置时区的权限就是正常权限。如果应用声明其需要正常权限,系统会自动向应用授予该权限。如需当前正常权限的完整列表,请参阅正常权限
  • 危险权限涵盖应用需要涉及用户隐私信息的数据或资源,或者可能对用户存储的数据或其他应用的操作产生影响的区域。例如,能够读取用户的联系人属于危险权限。如果应用声明其需要危险权限,则用户必须明确向应用授予该权限。

权限组

所有危险的 Android 系统权限都属于权限组。如果设备运行的是 Android 6.0(API 级别 23),并且应用的targetSdkVersion 是 23 或更高版本,则当用户请求危险权限时系统会发生以下行为:

  • 如果应用请求其清单中列出的危险权限,而应用目前在权限组中没有任何权限,则系统会向用户显示一个对话框,描述应用要访问的权限组。对话框不描述该组内的具体权限。例如,如果应用请求READ_CONTACTS 权限,系统对话框只说明该应用需要访问设备的联系信息。如果用户批准,系统将向应用授予其请求的权限。
  • 如果应用请求其清单中列出的危险权限,而应用在同一权限组中已有另一项危险权限,则系统会立即授予该权限,而无需与用户进行任何交互。例如,如果某应用已经请求并且被授予了 READ_CONTACTS 权限,然后它又请求 WRITE_CONTACTS,系统将立即授予该权限。

任何权限都可属于一个权限组,包括正常权限和应用定义的权限。但权限组仅当权限危险时才影响用户体验。可以忽略正常权限的权限组。

如果设备运行的是 Android 5.1(API 级别 22)或更低版本,并且应用的 targetSdkVersion 是 22 或更低版本,则系统会在安装时要求用户授予权限。再次强调,系统只告诉用户应用需要的权限,而不告知具体权限。

表 1. 危险权限和权限组。

权限组 权限
CALENDAR    (日历数据)
CAMERA      (相机)
  • CAMERA                        拍照权限
CONTACTS    (联系人)
LOCATION    (位置)
MICROPHONE  (麦克风)
PHONE       (电话)
SENSORS    (传感器)
SMS        (短信)
  • SEND_SMS                      发送短信
  • RECEIVE_SMS                   接收短信
  • READ_SMS                      读取短信内容
  • RECEIVE_WAP_PUSH              接收Wap Push
  • RECEIVE_MMS                   接收彩信
STORAGE    (存储)



我的获取权限方式:

public class MainActivity extends AppCompatActivity {
    String[] mPermissionList = new String[]{Manifest.permission.CAMERA};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (Build.VERSION.SDK_INT > 22) {
            ActivityCompat.requestPermissions(this, mPermissionList, 0);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case 0: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(getApplicationContext(), "同意此权限 " + grantResults[0], Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), "拒绝此权限 " + grantResults[0] + permissions, Toast.LENGTH_SHORT).show();
                    showMissingPermissionDialog(permissions);
                }
                return;
            }
        }
    }

    /**
     * 显示提示信息
     *
     * @param s
     * @since 2.5.0
     */
    public void showMissingPermissionDialog(final String[] s) {
        new AlertDialog.Builder(this)
                .setTitle("权限申请")
                .setMessage("拒绝此权限功能将无法正常使用")
                .setCancelable(false)
                .setNegativeButton("退出",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                //  拒绝, 退出应用
                                dialog.dismiss();
                                finish();
                            }
                        })

                .setPositiveButton("去设置",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ActivityCompat.requestPermissions(MainActivity.this, s, 0);
                            }
                        }).show();
    }


获取权限官方提供:

public class MainActivity extends AppCompatActivity {
    private static final int PERMISSIONS_CODE = 111; // 请求码

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * 检查是否拥有某权限
         *
         * 如果应用具有此权限,方法将返回 PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。
         * 如果应用不具有此权限,方法将返回 PERMISSION_DENIED,且应用必须明确向用户要求权限。
         */
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(getApplicationContext(), "没有此权限", Toast.LENGTH_SHORT).show();
            /**
             * 如果应用之前请求过此权限但用户拒绝了请求,此方法将返回 true。
             */
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
                Toast.makeText(getApplicationContext(), "拒绝过此权限", Toast.LENGTH_SHORT).show();
                // Show an expanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.
            } else {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}
                        , PERMISSIONS_CODE);
            }
        } else {
            Toast.makeText(getApplicationContext(), "拥有此权限", Toast.LENGTH_SHORT).show();
        }
        
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == PERMISSIONS_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(getApplicationContext(), "同意权限", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getApplicationContext(), "拒绝权限", Toast.LENGTH_SHORT).show();
                showMissingPermissionDialog();
            }
        }
    }

    /**
     * 显示提示信息
     *
     * @since 2.5.0
     */
    public void showMissingPermissionDialog() {
        new AlertDialog.Builder(this)
                .setTitle("权限申请")
                .setMessage("拒绝此权限功能将无法正常使用")
                .setCancelable(false)
                .setNegativeButton("退出",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                //  拒绝, 退出应用
                                dialog.dismiss();
                                finish();
                            }
                        })
                .setPositiveButton("去授权",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 0);
                            }
                        }).show();
    }

就这么简单明了,弹窗自己加的,希望对大家有帮助!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值