Android6.0运行时权限

来源:互联网 发布:java监控服务状态 编辑:程序博客网 时间:2024/06/05 05:37

在记事本应用中插入图片时,参考网上的知识来获取手机中的图片,然而报错说 权限需要在运行时获取,然后发现在Android6.0之后,加入了运行时权限,以保障用户的隐私

定义

Android的权限机制从第一个版本就有了,一些软件流氓,不管用不用的到这些权限,都会把权限全部申请了。
然后Android针对这些问题,在Android 6.0(API23)时加入了运行时权限,从而更好的保护了用户的隐私安全。

运行时权限就是用户不需要再安装软件的的时候一次性授权所有的权限,而是在软件使用过程中针对某一些权限进行申请。并不是所有的权限都要在运行时申请,这样得多麻烦。Android将权限分为了两类,1 普通权限,2 危险权限

  • 普通权限就是说不会直接威胁到用户的安全和隐私。这些权限系统会自动授权,只要你声明了。
  • 危险权限就是涉及用户隐私的。这些就要运行时动态申请了

普通权限和危险权限

Android系统有上百种权限,危险权限如下图,其他的就是普通权限了

危险权限.png
但是 有一个地方需要注意
表格中每个权限都属于一个权限组,要是申请了权限组的一个权限,那么该权限组的所有权限都会同时被授权。
比如,申请了WRITE_EXTERNAL_STORAGE这个权限,那么和它在同一权限组的READ_EXTERNAL_STORAGE也会同时被授权!
所以很多流氓软件依旧钻空子,因为要获取手机的IMEI等信息,所以PHONE权限组里的权限也会被授权,所以同时也获得拨打电话等权限

不在这张图的权限可以直接在manifest文件里声明就行了(API23以上),不过平时为了兼容低版本,任何权限都要声明在manifest文件里,然后在Activity中针对API23以上申请运行时权限

动态申请运行时权限

一般情况下,比如申请读写内存卡权限
Manifest.permission.WRITE_EXTERNAL_STORAGE

声明权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在Activity的onCreate里

 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {            ActivityCompat.requestPermissions(MainActivity.this, new String[]{                    Manifest.permission.WRITE_EXTERNAL_STORAGE            }, 1);        } else {            //达到需要的权限,执行操作            Log.d("Picture", "处理");        }

Activity里加上回调,控制权限申请窗口弹出来的的逻辑

@Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[]permissions, @NonNull int[] grantResults) {        switch (requestCode) {            case 1:                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    //权限够了处理逻辑                    Log.d("Picture", "处理");                } else {                    Toast.makeText(this, "权限不够,程序将退出", Toast.LENGTH_SHORT).show();                    finish();                }                break;            default:                break;        }    }

6获取操作时权限.jpg

原创粉丝点击