关闭

关于android6.0权限的问题

167人阅读 评论(0) 收藏 举报

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:208310次
    • 积分:3087
    • 等级:
    • 排名:第11264名
    • 原创:96篇
    • 转载:35篇
    • 译文:0篇
    • 评论:31条
    最新评论