#调研一下Android 6.0临时运行权限

调研一下Android 6.0临时运行权限

调研一下原理

概述

临时运行权限是Android 6.0所带来的变化,主要是为了解决app滥用权限的现象。6.0之前的系统app安装的时候会有一个权限列表用户同意了以后才可以安装,而6.0以后用户可以直接安装app,当app需要使用某些危险权限的时候系统会给用户提示,用户可以选择拒绝和同意,同时用户可以设置里面查看app的权限。

危险权限和普通权限

Google将权限分为了两类

第一种是普通权限(Normal Permission),这些权限不会涉及用户的隐私

  • ACCESS_LOCATION_EXTRA_COMMANDS
  • ACCESS_NETWORK_STATE
  • ACCESS_NOTIFICATION_POLICY
  • ACCESS_WIFI_STATE
  • BLUETOOTH
  • BLUETOOTH_ADMIN
  • BROADCAST_STICKY
  • CHANGE_NETWORK_STATE
  • CHANGE_WIFI_MULTICAST_STATE
  • CHANGE_WIFI_STATE
  • DISABLE_KEYGUARD
  • EXPAND_STATUS_BAR
  • GET_PACKAGE_SIZE
  • INSTALL_SHORTCUT
  • INTERNET
  • KILL_BACKGROUND_PROCESSES
  • MODIFY_AUDIO_SETTINGS
  • NFC
  • READ_SYNC_SETTINGS
  • READ_SYNC_STATS
  • RECEIVE_BOOT_COMPLETED
  • REORDER_TASKS
  • REQUEST_INSTALL_PACKAGES
  • SET_ALARM
  • SET_TIME_ZONE
  • SET_WALLPAPER
  • SET_WALLPAPER_HINTS
  • TRANSMIT_IR
  • UNINSTALL_SHORTCUT
  • USE_FINGERPRINT
  • VIBRATE
  • WAKE_LOCK
  • WRITE_SYNC_SETTINGS

第二种是危险权限(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

要做的几件事

AndroidManifast.xml文件中的权限还是要添加,不然系统还是会报错

1.检查权限

ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED

2.申请权限

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 1);

3.处理权限回调

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] 
 grantResults) 
  {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 1) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Intent intent = new Intent(Intent.ACTION_CALL);
            Uri data = Uri.parse("tel:" + phoneNumber);
            intent.setData(data);
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            startActivity(intent);
        } else {
            Toast.makeText(getApplicationContext(), "Permisson Denied", Toast.LENGTH_SHORT).show();
        }
    }
}

简单的例子

PermissionSimpleTest

常见的三方库

  1. AndPermission
  2. RxPermission
  3. PermissionGen
  4. MPermissions

常见三方库的用法

AndPermission

地址:https://github.com/yanzhenjie/AndPermission

用法:

  1. 依赖方式:

    远程依赖

    compile 'com.yanzhenjie:permission:1.0.1'

  2. 申请一个权限:

    //申请权限

     AndPermission.with(this)
             .requestCode(101)
             .permission(Manifest.permission.WRITE_CONTACTS,
                     Manifest.permission.READ_SMS,
                     Manifest.permission.WRITE_EXTERNAL_STORAGE)
             .rationale(mRationaleListener)
             .callback(listener)
             .start();
    
  3. 申请多个权限:

    //申请权限

     AndPermission.with(this)
             .requestCode(101)
             .permission(Manifest.permission.WRITE_CONTACTS,
                     Manifest.permission.READ_SMS,
                     Manifest.permission.WRITE_EXTERNAL_STORAGE)
             .rationale(mRationaleListener)
             .callback(listener)
             .start();
    
  4. 回调处理:

  1. Listener方式回调

        private PermissionListener listener = new PermissionListener() {
    
             @Override
             public void onSucceed(int requestCode, List<String> grantedPermissions) {
    
        // 权限申请成功回调。
    
        // 这里的requestCode就是申请时设置的requestCode。
       // 和onActivityResult()的requestCode一样,用来区分多个不同的请求。
         if (requestCode == 101) {
          // TODO ...
          Toast.makeText(getApplicationContext(), "申请权限成功", Toast.LENGTH_SHORT).show();
      }
      }
    
      @Override
      public void onFailed(int requestCode, List<String> deniedPermissions) {
      // 权限申请失败回调。
      if (requestCode == 101) {
          // TODO ...
          Toast.makeText(getApplicationContext(), "申请权限失败", Toast.LENGTH_SHORT).show();
        }
       }  
      };
    
  2. 注解方式回调

       // 成功回调的方法,用注解即可,里面的数字是请求时的 requestCode。
          @PermissionYes(100)
          private void getLocationYes() {
       // 申请权限成功,可以去做点什么了。
          Toast.makeText(this, "获取定位权限成功", Toast.LENGTH_SHORT).show();
          }
    
       // 失败回调的方法,用注解即可,里面的数字是请求时的 requestCode。
            @PermissionNo(100)
          private void getLocationNo() {
       // 申请权限失败,可以提醒一下用户。
              Toast.makeText(this, "获取定位权限失败", Toast.LENGTH_SHORT).show();
           }
    
  3. Rationale能力

    Android运行时权限有一个特点,就是用户在拒绝过一次权限以后,再次申请权限的时候弹出的提示框中会多一个【不再提示】的选项,
    当用户选择并拒绝申请的时候,那么以后再次申请权限将直接导致申请失败!因此为了避免用户以后一直无法申请权限,Rationale显然是
    有必要的,Rationale的功能是在用户拒绝申请之前提示用户申请这个权限的目的和用处,Rationale的提示框是开发者可以定义的。

       private RationaleListener mRationaleListener = new RationaleListener() {
         @Override
            public void showRequestPermissionRationale(int requestCode, final Rationale rationale) {
               new AlertDialog.Builder(AndPermissionActivity.this)
                   .setTitle("友好提醒")
                    .setMessage("没有定位权限将不能为您推荐附近妹子,请把定位权限赐给我吧!")
                   .setPositiveButton("好,给你", new DialogInterface.OnClickListener() {
                      @Override
                     public void onClick(DialogInterface dialog, int which) {
                         dialog.cancel();
                         rationale.resume();// 用户同意继续申请。
                     }
                 })
                 .setNegativeButton("我拒绝", new DialogInterface.OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
                         dialog.cancel();
                         rationale.cancel(); // 用户拒绝申请。
                     }
                 }).show();
         }
     };
    

RxPermission

地址:https://github.com/tbruyelle/RxPermissions

PermissionGen

地址:https://github.com/lovedise/PermissionGen

用法

  1. 申请权限

     PermissionGen.with(MainActivity.this)
         .addRequestCode(100)
         .permissions(
             Manifest.permission.READ_CONTACTS,
             Manifest.permission.RECEIVE_SMS,
             Manifest.permission.WRITE_CONTACTS)
         .request();
    
  2. 回调处理

    1. 回调方式一

          @Override 
        public void onRequestPermissionsResult(int requestCode, String[] permissions,
         int[] grantResults) {
           PermissionGen.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
           }
      
    2.  @PermissionSuccess(requestCode = 100)           
          public void test(){
             startActivity(new Intent(this, ContactActivity.class));
          }
       @PermissionFail(requestCode = 100)
          private void test2() {
             Dlog.debug("contact fail");
        }
      

MPermissions

地址:https://github.com/hongyangAndroid/MPermissions

AndPermission和PermissionGen的对比

AndPermission的最大的有点就是有一个Rationale这对于用户是一个不错的体验,并且我们可以自定义Dialog,这是PermissionGen不具备的。
AndPermission具备在其它类中申请权限的能力,这显然也是PermissionGen不具备的
PermissionGen代码量相对较少,调用方便。
两个库都不具备判断具体哪个权限被拒绝的能力

选择一个三方库

AndPermission

参考文章:
http://blog.csdn.net/lmj623565791/article/details/50709663
http://www.jianshu.com/p/a1edba708761

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容