Android M (API 23) 记录

从6.0开始,获得用户权限已经不在是通过安装程序时获得。这种方法简化了程序安装的过程,因为不需要用户在安装或者更新时授予权限。这也给了用户控制app的功能。例如,用户可以选择给一个app打开相机的权限而不是设备的位置。用户可以在任何时候去收回权限,通过app的Setting。

系统权限被分成了两类,normal和dangerous

  • normal的权限不会直接危害到用户的隐私,如果你的app在manifest中声明了normal的权限,系统会自动的授予权限。
  • dangerous的权限会授予app访问用户机密数据的权利。如果你在manifest中声明了normal权限,系统会自动授予。如果声明了dangerous权限,用户可以显式地授予app这个权限。

dangerous权限如下所示:

       



无论是normal的权限还是dangerous的权限都需要在manifest中声明。然而,app目标SDK的等级和app所在系统的版本的不同都会让权限的声明产生不同的效果
  • 如果app跑在5.1及以下系统中,并且app的target sdk小于等于22:如果你在manifest中列出dangerous权限,系统会在用户安装时让用户去准许;如果用户不允许这些权限,系统就不会安装你的app
  • 如果app跑在6.0及以上系统时,并且app的target sdk大于等于23。如果你在manifest中列出dangerous权限,在app运行的时候,系统会在app每次需要dangerous权限的时候去询问。用户可以授予或者拒绝每个权限。如果用户拒绝授予,系统可以继续运行,但是权限被限制了。

Check For Permissions

如果你的app需要dangerous权限,当你做的操作用到这些权限时,你必须要检查是否你拥有这个权限。用户总是可以很轻松的去掉这些权限的授予。所以即使app昨天刚刚使用了照相机,也不意味着今天这个权限依然被授予。
通过 ContextCompat.checkSelfPermission()方法可以检查是否拥有某个权限,例如,这个代码片段展示的是怎么去检查这个activity有没有向日历中写的权限:
int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_CALENDAR);
                if(permissionCheck == PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(MainActivity.this,"授予",Toast.LENGTH_SHORT).show();
                }else if(permissionCheck == PackageManager.PERMISSION_DENIED){
                    Toast.makeText(MainActivity.this,"拒绝",Toast.LENGTH_SHORT).show();
                }
如果返回值的结果和PackageManager.PERMISSION_DENIED一致,则必须让app显示的去询问用户是否授予权限


Request Permissions

当你使用manifest中列出的dangerous权限没有被授予时,可以使用android提供的一些方法去询问是否授予权限。可以直接调用系统的dialog,不用自己定制

Explain why the app needs permissions

有些时候为了帮助系统不知道要不要询问用户,是否需要授权某个dangerous权限(弹出dialog),但是用户可能需要被解释为什么要用这个权限的。为了应付这种情况Android提供了 shouldShowRequestPermissionRationale()方法来做这件事。如果app之前被询问过权限问题并且用户否认了这个权限,那么该方法就会返回true。
⚠:如果用户之前拒绝了该权限的请求并且选择Don't ask again选择在dialog中,方法会返回false。如果设备觉得该权限有风险,也会返回false。

Request the permissions you need

如果你的app没有获得它想要的permission,app需要调用 requestPermissions()方法去请求这个权限。如果 shouldShowRequestPermissionRationale()返回true,再true中调用 requestPermissions()方法会弹出一个dialog来询问用户,如果如果 shouldShowRequestPermissionRationale()返回false,再false中调用 requestPermissions()方法则不会弹出一个dialog。但 onRequestPermissionsResult()回调方法都会得到它们参数中的一个int值。在回调函数中可以做一些处理,具体看代码:
int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS);
                if(permissionCheck == PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(MainActivity.this,"授予",Toast.LENGTH_SHORT).show();
                }else if(permissionCheck == PackageManager.PERMISSION_DENIED){
                    //没有该权限
                    if(ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,Manifest.permission.READ_CONTACTS)){
                        Log.d("TAG","弹出询问");
                        Toast.makeText(MainActivity.this,"123",Toast.LENGTH_SHORT).show();
                        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_CONTACTS}, 123);
                    }else {
                        Log.d("TAG","也需要弹出询问(已经被拒绝并且不再询问,已经被拒绝通过上个判断结果得出" +
                                "需要跟用户解释某些功能无法使用因为权限原因" +
                                "之前用户关闭这个功能并且不让询问了,需要用户手动更改"+
                                "");
                        Toast.makeText(MainActivity.this,"123",Toast.LENGTH_SHORT).show();
                        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_CONTACTS}, 123);
                    }
                }



处理请求函数 onRequestPermissionsResult()
@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        Toast.makeText(MainActivity.this,grantResults[0]+"~~",Toast.LENGTH_SHORT).show();
        switch (requestCode){
            case 123:
                if(grantResults.length>0&&grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(MainActivity.this,"弹出dialog,用户授权,用户同意",Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(MainActivity.this,"弹出dialog,用户授权,用户不同意,提醒用户没有该权限不能使用功能",Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                
        }
    }


===========================================================================================================

Permissions Best Practices

























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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值