Android6.0权限机制(一):介绍

本篇文章已授权微信公众号 hongyangAndroid (鸿洋)独家发布
Android6.0权限机制(一):介绍
Android6.0权限机制(二):封装
Android6.0权限机制(三):6.0以前国产手机权限处理

为何google在6.0加入这个权限机制

android6.0之前其实也有权限机制,很简单就是开发者在manifest.xml注册,用户安装app时候,当做权限清单列出来告知用户我需要这些个权限,但是这样用户基本不会去看,导致app权限滥用造成安全隐患。

权限分类

Android权限有100多种不可能每种都去运行时授权,因此google把权限分为两类:
1.普通权限:例如网络请求等,按照老的权限机制
2.危险权限:9种共24个(电话,短信,sd卡,位置,摄像头,传感器,日历,录音,联系人),就是我们要动态申请的。

用adb命令查看危险权限列表:(tip:记住9种24类)

adb shell pm list permissions -d -g
Dangerous Permissions:

group:android.permission-group.CONTACTS
  permission:android.permission.WRITE_CONTACTS
  permission:android.permission.GET_ACCOUNTS
  permission:android.permission.READ_CONTACTS

group:android.permission-group.PHONE
  permission:android.permission.READ_CALL_LOG
  permission:android.permission.READ_PHONE_STATE
  permission:android.permission.CALL_PHONE
  permission:android.permission.WRITE_CALL_LOG
  permission:android.permission.USE_SIP
  permission:android.permission.PROCESS_OUTGOING_CALLS
  permission:com.android.voicemail.permission.ADD_VOICEMAIL

group:android.permission-group.CALENDAR
  permission:android.permission.READ_CALENDAR
  permission:android.permission.WRITE_CALENDAR

group:android.permission-group.CAMERA
  permission:android.permission.CAMERA

group:android.permission-group.SENSORS
  permission:android.permission.BODY_SENSORS

group:android.permission-group.LOCATION
  permission:android.permission.ACCESS_FINE_LOCATION
  permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE
  permission:android.permission.READ_EXTERNAL_STORAGE
  permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.MICROPHONE
  permission:android.permission.RECORD_AUDIO

group:android.permission-group.SMS
  permission:android.permission.READ_SMS
  permission:android.permission.RECEIVE_WAP_PUSH
  permission:android.permission.RECEIVE_MMS
  permission:android.permission.RECEIVE_SMS
  permission:android.permission.SEND_SMS
  permission:android.permission.READ_CELL_BROADCASTS

看到上面的dangerous permissions,会发现一个问题,好像危险权限都是一组一组的那么有个问题:分组对我们的权限机制有什么影响吗?的确是有影响的,如果app运行在Android 6.x的机器上,对于授权机制是这样的。如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。比如你的app对READ_CONTACTS已经授权了,当你的app申请WRITE_CONTACTS时,系统会直接授权通过。此外,对于申请时弹出的dialog上面的文本说明也是对整个权限组的说明,而不是单个权限(ps:这个dialog是不能进行定制的)。不过需要注意的是,不要对权限组过多的依赖,尽可能对每个危险权限都进行正常流程的申请,因为在后期的版本中这个权限组可能会产生变化。

怎么兼容

1.假设我们的项目之前没加这个权限机制,那现在我们怎么处理呢,要不要加这个权限判断,这个取决与app的版本兼容性也就是你们是否愿意为Android6.0以上的用户们处理这个问题。targetSdkVersion这个属性就是控制是否要引入权限机制的开关。

  • 项目中targetSdkVersion<23: 按照老的权限机制,只在manifest声明就可以了,运行不会报错,但是会有隐患:
    比如,我的APP有个拨号功能,把targetSdkVersion=21,安装到API23(Android6.0)的设备,可以正常拨号,看似正常。
    但是用户可以直接去设置里面关掉权限:
image.png

我在模拟器上有这个警告提示,但不保证所有手机都会有这个提示!这时再打开APP就无法拨号了,由于没有检查权限,用户得不到任何提示,一脸懵逼。

  • targetSdkVersion>=23: 这时就需要在代码中检查权限了,否则打开app去执行需要权限的操作会崩溃。如果关闭权限将会弹出提示框提示你开启权限。

2.如果app原先的targetSdkVersion低于23,现在升级到targetSdkVersion=23的app,那么里面的权限默认全部开启!除非用户卸载重装这个app,才是默认关闭所有权限

关于读写SD卡权限

在6.0之前由于读写SD没有限制,导致sd卡目录被app滥用,于是google把sd卡续写权限列为危险权限,如果开发者不想申请sd卡读写权限,可以访问0/Android/data/包名 这个目录,不需要权限可以随便访问,Android也是建议开发者将这个目录作为app的缓存目录

使用

  • 首先配置build.gradle,targetSdkVersion版本应该>=23,然后导入support-v4包:
apply plugin: 'com.android.application'
    android {
       compileSdkVersion 23
        buildToolsVersion "25.0.2"
        defaultConfig {
            applicationId "com.example.carmelo.myapplication"
            minSdkVersion 19
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
        }
        buildTypes {
            release {
                minifyEnabled false
            }
        }
    }
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-v4:23.2.1'
}
  • manifest.xml声明权限
<uses-permission android:name="android.permission.CALL_PHONE"/>
  • 在Activity或者Fragment中判断是否开启了这个权限,如果开启了就拨号,没有的话就申请权限:

界面弹出框:拒绝或者同意,回调两种结果:

[图片上传中。。。(2)]

public class MyActivity extends Activity {
    private Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);
        btn = (Button) findViewById(R.id.textView);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int check = ContextCompat.checkSelfPermission(MyActivity.this, Manifest.permission.CALL_PHONE);
                if(check== PackageManager.PERMISSION_GRANTED){
                    call();
                }else {
                    ActivityCompat.requestPermissions(MyActivity.this
                            ,new String[]{Manifest.permission.CALL_PHONE}
                            , 1);
                }
            }
        });
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode==1){
            if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
                call();
            }else {
                Toast.makeText(MyActivity.this,"没有拨打电话权限",Toast.LENGTH_SHORT).show();
            }
        }
    }
    private void call(){
        Intent intent = new Intent();
        intent.setData(Uri.parse("tel://1212121212"));
        intent.setAction(Intent.ACTION_CALL);
        startActivity(intent);
    }
}
  • 不再提示的处理:
    如果用户勾选了不再提示,并且拒绝了权限,那么后面不会再弹框,并且结果一直回调到没有权限,此时根据产品需求处理,一般2种方法:
  1. 在回调中弹出Dialog跳到设置界面开启权限
  2. 直接弹出提示:没有权限(这种更好),因为用户就是拒绝了权限,不要烦他了
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容