关于android6.0权限的问题

原创 2016年08月31日 16:27:43

   android6.0使用了新的权限管理,不再是之前的一刀切作法。对于开发者而言,23之前的权限管理其实更简单,但对于用户来说,其实没有这么人性化。所以我猜这就是为什么在android6.0权限管理改变的原因。最近在弄一点关于权限的相关的开发,结果遇到了不少坑,当然这些坑对于老鸟来说也许不是什么问题,但到于新手来说也许有点借鉴作用。

   要弄清楚这些权限的运行,首先了解一下android6.0的权限分类。下面偷来一图和说明文字。


    在图中,我们可以看到整个权限里,可以分为系统权限和特殊权限授权。系统权限中,又分为normal和dangerous类型。normal:这个权限类型并不直接威胁到用户的隐私,可以直接在manifest清单里注册,系统会帮我们默认授权的。dangerous:这个可以直接给app访问用户一些敏感的数据,不仅需要在manifest清单里注册,同时在使用的时候,需要向系统请求授权。值得注意一点,这里有特殊权限授权的区别,分别是SYSTEM_ALERT_WINDOW 和 WRITE_SETTINGS,虽然这两个权限也是属于dangerous权限类型,但是这两个授权请求方式和其他dangerous权限是不一样的,需要特殊处理 。

  

 normal列表:


对我来说,我要处理的是危险权限,也就是表格里面权限。这里还一个概念:权限组。正如表格看到的情况,这些权限是分组的。有时候,你一旦获取权限组里面WRITE权限,其他READ的权限自动获得。或者获取SEND权限,READ权限也就自动获得。所以,在android6.0里面应用程序管理的权限管理,只看到如短信、电话之类的权限,实际上是一组权限。一旦获得,整组的权限都获得。如下图:



正如上图展示的权限管理,用户可以随时手动开启或关闭这些权限。这就是和API小于23的管理模式最大的不同之处了。但android6.0之后,使用这些权限就要特别小心了,试图操作没有权限代码就可能让程序崩溃,所以用户不得不在使用这些权限时检测是否有授权。


实际应用。

越来越多的设备升级到android6.0是必然的趋势。所以开发者们不能不在权限这事上花些时间来研究下,把应用程序写好。

一、版本检测。这段代码可以检查当前系统的版本是运行在android6.0以上:Build.VERSION.SDK_INT >= 23

二、权限检测。ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.WRITE_CALENDAR) 。此方法返回int类型,-1代表没有授权。

三、请求权限。

   

// Here, thisActivity is the current activity
//判断是否己经授权
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // 检测是否需要提示
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.
       //不需要提示,请求权限。一次可以申请多个权限

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

         MY_PERMISSIONS_REQUEST_READ_CONTACTS,这个值是一个int 常量。

四、请求权限响应。

           

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: { //这里是上面那个值,表示某次请求权限影响
            if (grantResults.length > 0) { //注意这里中处理了第一个权限结果,实际上可以返回多个权限结果的
                  if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    //权限通过
                  }else{
                    //用户拒绝
                   }
            }
            break;
        }
    }
}

五、特殊权限。

   Settings.canDrawOverlays() 方法进行判断之前是否已经授权过了。
针对WRITE_SETTINGS权限,需要向系统发送一个ACTION_MANAGE_WRITE_SETTINGS 这样一个动作,同时可以用Settings.System.canWrite().方法进行判断之前是否已经授权过了。
具体代码:

    

Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);  
intent.setData(Uri.parse("package:" + getPackageName()));  
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
startActivity(intent);

============================================================================================================================

 以上的资料一般都能从网上查得到,下面说说本人踩过的坑,这些坑跟自己的知识有限有关。

 1、要使onRequestPermissionsResult收到回调,requestPermissions方法必须与其放在同一个activity。

 2、所有需要用到的权限必须配置在AndroidManifest.xml。比如你需要一个权限,READ_SMS, 单单配置 SEND_SMS是不行的。虽然一旦请求了SEND_SMS,READ_SDS也会自动获得。

3、如果你使用ActivityCompat.requestPermissions()请求,请在activity实现接口implements ActivityCompat.OnRequestPermissionsResultCallback

4、注意点是如果系统权限弹窗提示框被不再提醒了,需要我们自定义提示弹窗,引导用户去授权。

关于Android6.0以上系统的权限问题

一、前言 在我们Android6.0以前,我们在开发时候不需要动态的在代码中添加权限,只需要在manifast.xml中配置我们所需要的权限即可,因为在我们安装时,会有一个权限列表,包含了所有我们在...
  • Administratortwd
  • Administratortwd
  • 2017年07月11日 10:42
  • 608

关于android6.0权限

关于android6.0权限一,权限变化android6.0及以后版本权限体制发生变化,权限可以分为系统权限和特殊权限。系统权限中,又分为normal和dangerous类型,危险权限需要程序员显示像...
  • i_black
  • i_black
  • 2016年12月05日 23:38
  • 121

关于Android6.0权限

Android6.0开始,有些权限的获取需要用以下方式来询问用户: int permissionCheck2 = ContextCompat.checkSelfPermission(this...
  • killfunst
  • killfunst
  • 2016年09月06日 14:38
  • 251

关于Android6.0 权限 文件读写

今天做东西的时候需要往文件中做读写操作,在android4.4版本中在Manifest.xml加入权限即可。 但是当APK装到6.0的机器上无法生成写入的文件。 当时百度了下貌似是androi...
  • qq_21117455
  • qq_21117455
  • 2017年06月09日 15:50
  • 60

关于Android6.0权限适配的问题

1.适配的背景           由于Android系统的碎片化严重,适配成了不可或缺的重要步骤;最近在项目中负责Android6.0的各种危险权限的适配,今天借此机会,向大家分享一下适配的原理。...
  • zhangxing52077
  • zhangxing52077
  • 2016年12月08日 21:11
  • 2089

Android6.0的蓝牙权限问题

#Android6.0的蓝牙权限问题 在Adroid6.0以前,申请权限只需在manifest文件下申请相应的权限即可,但是Android6.0后,像一些危险权限,比如操作SD卡的写...
  • paul_zzq
  • paul_zzq
  • 2017年04月26日 11:14
  • 2546

Android6.0以上权限获取权限的问题

今天把 targetSdkVersion 从22 换成23  项目里面有一个录视频的应用    直接启动  在 targetSdkVersion>=23 里面 拍摄视频的代码 就报错了。     ...
  • hellonihao100
  • hellonihao100
  • 2016年08月31日 14:28
  • 1407

关于android6.0动态获取权限

android6.0及6.0以上的系统在权限管理方面和android6.0以下的系统有了很大的不同,都知道android6.0以下的系统只需要在AndroidManifest.xml进行配置就可以了,...
  • wangwo1991
  • wangwo1991
  • 2017年01月22日 09:56
  • 876

Android6.0以下判断手机录音和相机权限

Android手机6.0以上的运行权限想必大家都已经熟悉了,但有时候项目中要考虑6.0以下系统的权限问题,因为国产手机系统的特性,很多手机自带安全软件,使用相机或录音时候会询问权限,一般拒绝之后我们不...
  • yuan7016
  • yuan7016
  • 2017年06月25日 21:26
  • 712

关于Android 6.0 + 权限开发 解决办法

Android 6.0 关于permission 开发:http://www.2cto.com/kf/201604/498776.html; 解决方法: 一 、去手机设置找到该应用 允许权限; 二、在...
  • a2241076850
  • a2241076850
  • 2016年08月18日 14:38
  • 1827
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于android6.0权限的问题
举报原因:
原因补充:

(最多只允许输入30个字)