关于android6.0及以上版本运行时权限的学习笔记

原创 2016年08月29日 21:26:39

最近在做一个查询联系人的小功能的时候,出现了以下错误:

Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{374d058 4051:com.beasy.SiDaZuJian.www/u0a63} (pid=4051, uid=10063) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS

毫无疑问,这是一个关于权限的错误,但是我在AndroidManifest里面已经加了读取和写入联系人的权限了。经过在网上的搜索查阅之后我才发现这是一个关于SDK版本的问题,android6.0带来了许多变化,其中之一就是关于权限的变化,它被分为普通权限(Normal Permissions)和运行时权限(Dangerous Permission),这更好的保护了android手机用户的隐私

  • 普通权限(Normal Permissions)
    例如访问网络、链接WIFI,这些权限一般不泻需要获取用的隐私信息,所以不需要用户自己手动授权

  • 运行时权限(Dangerous Permission)
    例如访问SD卡,获取联系人,这些权限一般都要获取用户的隐私信息,需要用户自己手动授权


下面放上我修改后的代码:

 public final static int READ_CONTACTS_CODE = 1001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_content_provider);
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS},
                    READ_CONTACTS_CODE);
        } else {
            LogInfo();
        }

    }

    public void LogInfo() {
        ContentResolver cr = getContentResolver();
        Cursor c = cr.query(ContactsContract.Contacts.CONTENT_URI, new String[]{ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME}, null, null, null);
        if (c != null) {
            while (c.moveToNext()) {
                Log.i("info", "_id:" + c.getInt(c.getColumnIndex("_id")));
                Log.i("info", "name:" + c.getString(c.getColumnIndex("display_name")));
            }
        }
        c.close();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case READ_CONTACTS_CODE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    LogInfo();
                } else {
                    Toast.makeText(ContentProviderActivity.this, "无法获取权限!", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED 是用来检查是否已经获取了读取联系人的权限,PackageManager.PERMISSION_GRANTED 是已经授权, PackageManager.PERMISSION_DENIED 是还未授权;

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, READ_CONTACTS_CODE) 申请授权,三个传入参数分别为context,权限和用于回调时检测的唯一值;

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 是回调函数,其中的参数 grantResults 是用户授权结果

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

Android 6.0及以上版本的运行时权限介绍

本文转自http://blog.csdn.net/vanpersie_9987/article/details/51115619; 运行时权限(Runtime Permission)是Android...
  • wei_zhi
  • wei_zhi
  • 2016年04月14日 20:11
  • 2483

android6.0运行时权限完美封装

前几天看了郭大神的运行时权限的专讲,深受启发,由于现在基于目前项目中的运行时权限封装的还不是那么完美,趁着郭神建议的还是历历在目。于是把它完整的敲了下来。在加上自己的一些见解,封装成一个完整的demo...
  • androidstarjack
  • androidstarjack
  • 2017年01月03日 13:41
  • 1986

Android 6.0 运行时权限管理最佳实践

Android 6.0 运行时权限管理最佳实践 这是一篇迟来的文章,Android M已经发布一年多了(6.0的变化),在Android M中权限系统被重新设计,发生了颠覆性的变化,很多人把...
  • qq263229365
  • qq263229365
  • 2016年09月12日 18:16
  • 418

Android 6.0 运行时权限处理完全解析

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663; 本文出自:【张鸿洋的博客】 一、概述 随着A...
  • lmj623565791
  • lmj623565791
  • 2016年02月22日 09:31
  • 239084

Android 6.0运行时权限请求示例

...
  • zxwd2015
  • zxwd2015
  • 2016年05月04日 09:28
  • 3502

Android 6.0 运行时权限处理解析

1.概述  不知道大家有没有遇到过这种情况,开发app的时候发现自己手机选择照片是正常的,测试那边的一台手机怎么搞都不行,然后查看版本之后才发现是6.0的手机。      随着Android ...
  • z240336124
  • z240336124
  • 2016年11月11日 17:55
  • 16801

Android 6.0 运行时权限介绍和使用方法及其封装

Android 6.0 新特性之运行时权限以及封装Easypermissions的使用方法介绍
  • fkq_2016
  • fkq_2016
  • 2017年01月12日 11:24
  • 2497

Android 6.0 运行时权限封装之路

前言时间如梭,总在不经意间流逝。经常会想,毕业到现在我都干了些什么,该有什么样的追求?运行时权限运行时权限是 Android 6.0 (SDK 23)新特性,更好的保护了用户的隐私。如果你build....
  • u012551350
  • u012551350
  • 2016年11月01日 17:42
  • 2322

适配android6.0:运行时权限检查机制

前言清明放假终于结束了,赶紧写点东西来脉动回来。这是一篇偏概念性的文章,文字偏多,所以别捉急,慢慢看。现在高版本的android系统市场占有率提升的非常快,这依赖于智能手机越来越便宜,越来越普遍,新手...
  • u011315960
  • u011315960
  • 2017年04月07日 15:52
  • 761

Android6.0运行时权限回调不执行的手机

使用android第一行代码(第二版)7.2节关于运行时权限的代码时,发现在真机魅族PRO6时若第一次在弹出的对话框中拒绝授权,则下次重新启动则不会再弹出是否授权对话框,并且此后状态为未授权状态!而模...
  • ruizhi51
  • ruizhi51
  • 2017年01月10日 23:38
  • 1397
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于android6.0及以上版本运行时权限的学习笔记
举报原因:
原因补充:

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