Android 6.0 以上权限问题

最近写的一个项目,由于本人也是新手,很久没关注新版本的变化,仍旧想着基于4.0开发。也就没注意这个细节。这个bug,是出现在了,点击选取照片按钮,出现弹出框,提示从相册中选取和拍照获取照片两种方式,但是他的一点就崩了。。。。原本正准备下班的我。。。又苦逼的回到办公桌。当时,他一提是这个问题的时候,我当即就猜出是权限的问题,直接说,你权限没打开。然而他说,也没提示啊,后来他手动打开权限,才没有崩溃。


当时这个事我也没有特别在意。后来总觉得很奇怪。如果别人安装一个应用,确实没啥提示,或者手机默认没开启,难道真的应该一点就崩了吗?


然后我就各种查询权限资料。最后猜找到了原因。原来我的测试机什么的都没事,原来我们的手机都是低于android 6.0的。


后来我就看了下android 6.0 的新特性,确实在权限管理上做了一些变化,更加人性化:应用安装时不再提示这些权限,而是在使用时提示这些权限


这里有三个相关的方法:

ContextCompat.checkSelfPermission():判断是否拥有该权限,返回值为PERMISSION_GRANTED,否则返回PERMISSION_DENIED


ActivityCompat.requestPermissions():弹出请求对话框,在6.0之前版本调用,OnRequestPermissionsResultCallback 直接被调用,带着正确的 PERMISSION_GRANTED或者 PERMISSION_DENIED 。

AppCompatActivity.onRequestPermissionsResult():这个看着是不是很眼熟,像不像Activity的OnActivityResult()的回调方法,没错,是一样的,主要接收请求授权的返回值


好了,废话不多说,直接上代码:

public void myClick(){
       
        if (Build.VERSION.SDK_INT >= 23) {
            int checkCallPhonePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
            if(checkCallPhonePermission != PackageManager.PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CALL_PHONE},REQUEST_CODE_ASK_CAMERA);
                return;
            }else{
                openCAMERA();
            }
        } else {
            openCAMERA();
        }
    }



是不是很简单,先做一下版本判断,然后判断下权限,没有这个权限就请求这个权限,反之,有这个权限就直接使用


然后再重写这个方法:

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case REQUEST_CODE_ASK_CAMERA:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    openCAMERA();
                }else {
                    // Permission Denied
                    Toast.makeText(MainActivity.this, "OPEN_CAMERA Denied", Toast.LENGTH_SHORT)
                            .show();
                }
                break;

            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }

    }

好了,大功告成。这样如果第一次使用,会弹出提示,请求权限,用户拒绝了的话,执行相应的操作即可,不会崩溃,下次还是会提示。如果允许的话,则就不会提示。这不就是我一直以来所追求的吗,哈哈。。


不过,这里也许会有人问,难道每个权限都这样写?

答案一定是NO,当然是敏感权限了!

图在下面:


可参考官网。  http://developer.android.com/training/permissions/requesting.html 
  http://developer.android.com/guide/topics/security/permissions.html#normal-dangerous


本人原创,图有雷同,纯属巧合,如转载或CV请标明出处,尊重原创,谢谢!


猜你喜欢

转载自blog.csdn.net/qq_30548105/article/details/52583351