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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android 6.0后的权限问题

Android 6.0后权限的动态申请1、做蓝牙开发时遇到一个问题,在安卓6.0系统中运行时,发现蓝牙搜索后并没有显示任何的设备信息,然后去查了下资料,发现在6.0以后的需要添加下面两个权限。 ...

Android6.0权限问题

Android6.0权限问题1、AndroidManifest.xml中android:targetSdkVersion=”22”以下使用旧版本权限,即强制用户使用权限,大于22 使用新版本权限,即权...

Android6.0权限处理问题

Android6.0运行时权限处理Android6.0的发布介绍了一种新的权限机制。用户可以在运行时直接管理应用程序的权限,这个功能提升了权限控制的可见性和可控性,同时简化了安装和自动升级过程,用户可...

记录一个Android 6.0权限问题的大坑

在利用Camera这个类的时候,我是按照官方的API写的,一开始就闪退报空指针!追根溯源,是camera没有实例化,但是我明明已经Camera.open()了!!于是乎,重新核对了一下代码,没发现问题...

解决Android 6.0动态添加权限问题

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInsta...

android 6.0权限开发---拍照,打开相册问题2

前几天纠结了很久的问题已经用传统的方式解决,android 6.0权限开发—拍照,打开相册问题1为什么在Android6.0之后读取权限需要手动添加在旧的权限管理系统中,权限仅仅在App安装时询问用户...

Android6.0蓝牙开发中获取附近低功耗蓝牙设备结果权限问题分析

问题描述: 近期做一个扫描附近低功耗蓝牙设备获取到rssi并进行一系列的相对的定位的功能。在开发前期一直使用低版本(Android6.0以下)的手机进行测试,没有任何问题。在运行到Android6....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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