Android6.0 运行时权限

原创 2016年06月01日 22:32:36

在android6.0的源码中有这样一段代码

     protected void startPhotoActivity(Intent intent, int requestCode, Uri photoUri) {
            mPhotoUri = photoUri;
            mStatus = Status.SUB_ACTIVITY;
            CompactContactEditorFragment.this.startActivityForResult(intent, requestCode);
     }

这边的 intent 传过来的是 ”android.media.action.IMAGE_CAPTURE“,这个 action 需要权限:

<uses-permission android:name="android.permission.CAMERA"/>

这样的一段代码放在 6.0 之前的版本上都是可以正常运行的。但是在6.0上运行就会出错,这就是android最新的运行时权限。

只要是涉及到隐私的权限,即使是在 manifest 中声明过,代码跑到的时候仍旧会要求用户授权。以下是在android6.0上的实现:

private static final int REQUEST_CODE_ASK_CAMERA = 1;
@Override
protected void startPhotoActivity(Intent intent, int requestCode, Uri photoUri) {
   mPhotoUri = photoUri;
   mStatus = Status.SUB_ACTIVITY;
   //检查有没有获取拍照权限
   if(ContextCompat.checkSelfPermission(mContext,Manifest.permission.CALL_PHONE)!=PackageManager.PERMISSION_GRANTED){
        //如果没有获取权限,就去请求权限,这个操作是异步的
        ActivityCompat.requestPermissions(mContext,new String[]{Manifest.permission.Manifest.permission.CAMERA},REQUEST_CODE_ASK_CAMERA);
    }else{
        CompactContactEditorFragment.this.startActivityForResult(intent, requestCode);
    }
}

上面如果检测到没有权限,就会去请求权限,会弹出一个对话框,如果用户授权,然后会回调 onRequestPermissionsResult 这个方法,我们需要复写它来处理授权的结果:

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_ASK_CAMERA://这是搜门上面请求的code
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //表示授权成功,这时候就可以再去调用相机应用,当然这边需要将intent和requestCode存下来
                    CompactContactEditorFragment.this.startActivityForResult(intent, requestCode);
                } else {
                    // 授权未成功
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

这样就实现了6.0的运行时权限。

并不是所有的权限都需要运行时授权,只有下面列出来的需要。其他的权限只需要在manifest中配置就可以,跟6.0以前的版本一样。可以看到下面的权限是分组的,如果一个组中某一个权限被授权了,那么这个组中的其他权限也将被授予。

运行时权限

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

相关文章推荐

基于V4L2视频采集缓存机制应用与实现

V4L是Linux针对视频设备的应用程序接口,V4L2为其升级版本,它修复了第一版的很多设计缺陷。然而它提供的常规读写函数并不能满足大数据量的高速传输,所以将缓存技术引入到视频采集领域可以提高系统的吞...

TCP传输小数据包效率问题(转载)

本文转自 http://blog.csdn.net/stamhe/archive/2009/09/19/4569530.aspx      s摘要:当使用TCP传输小型数据包时,程序的设计...

RxPermissions源码分析:使用RxJava处理Android 6.0运行时动态权限获取

项目地址:RxPermissions,本文分析版本: 4c4d4e1 1.简介 RxPermissions是基于RxJava开发的用于帮助在Android 6.0中处理运行时权限检...

Android6.0运行时权限框架封装

  • 2016年11月15日 18:46
  • 6.28MB
  • 下载

Android6.0运行时权限处理事例

  • 2016年11月11日 18:11
  • 6.28MB
  • 下载

Android新特性之6.0运行时权限

友情提示:只想看实现代码,可直接看第3部分:代码申请权限的步骤一、简述为了保证系统完整和保护用户隐私,每个app都运行在一个访问受限的沙盒中。app想要使用沙盒外的资源或信息,必须非常明确地请求适当权...

Android6.0运行时权限申请

  • 2017年02月10日 10:17
  • 23MB
  • 下载

android 6.0运行时权限 工具类

  • 2017年02月24日 21:35
  • 5KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android6.0 运行时权限
举报原因:
原因补充:

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