API23以上的运行时权限

2017-03-18  本文已影响134人  minminaya

Android学习整理 - 系列


Android的权限机制从第一个版本就有了,一些软件,不管用不用的到这些权限,都先申请了再说。比如某企鹅,安装软件时可以看到它要了读取和发送信息的权限,嘿嘿嘿,话说要这权限干嘛,。。。。
然后Android针对这些问题,在Android 6.0(API23)时安卓加入了运行时权限,从而更好的保护了用户的隐私安全。

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

普通权限和危险权限

危险权限和权限组

需要注意的是
表格中每个权限都属于一个权限组,要是申请了权限组的一个权限,那么该权限组的所有权限都会同时被授权。比如,申请了WRITE_EXTERNAL_STORAGE这个权限,那么和它在同一权限组的READ_EXTERNAL_STORAGE也会同时被授权!

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

动态申请运行时权限

一般情况下,比如,申请读写内存卡权限
Manifest.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(TAG, "权限够了");
        }

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(TAG, "权限够了,逻辑");
                } else {
                    Toast.makeText(this, "权限不够,程序将退出", Toast.LENGTH_SHORT).show();
                    finish();
                }
                break;
            default:
                break;
        }
    }

声明权限

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

然后运行,点击拒绝就直接finish()了

Gradle集成

推荐的开源库:
PermissionsDispatcher

中文版本: PermissionsDispatcher使用详解

使用:
使用PermissionsDispatcher轻松解决Android权限问题

另一种思路:
Android 6.0运行时权限简析及最佳实践


参考

系统权限

上一篇下一篇

猜你喜欢

热点阅读