【android】Contract Content Provider 通讯内容提供器Demo记录

Contract Content Provider 通讯📞内容提供器Demo

可以直接简单Demo下载
方便下一步的研究和学习;

编码中遇到的问题:

  1. permisson权限问题:

java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{8dc4b6b 28533:com.example.contractcontentprovidertest/u0a392} (pid=28533, uid=10392) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS

解决方法,大致的思路就是通过询问user给不给权限。权限问题在android6后是特别重视的!这里也可以直接代码动态申请权限:
代码如下;


   private static String[] PERMISSIONS_STORAGE = {//动态申请权限列表
//            "android.permission.WRITE_CONTACTS",
            "android.permission.READ_CONTACTS"};//读通讯录权限的权限名
    private PermissionListener mListener;


  private void getReadPhone() {
        if (Build.VERSION.SDK_INT >= 23) {//判断当前系统是不是Android6.0
            requestRuntimePermissions(PERMISSIONS_STORAGE, new PermissionListener() {
                @Override
                public void granted() {
                    Log.e("读通讯录权限申请", "已通过");
//                    GetNumber.getNumber(SplashActivity.this);
                }
 
                @Override
                public void denied(List<String> deniedList) {
                    //权限申请未通过
                    Log.e("读通讯录权限申请", "已拒绝");
                }
            });
        }
    }
    /**
     * 申请权限
     */
    public void requestRuntimePermissions(
            String[] permissions, PermissionListener listener) {
        mListener = listener;
        List<String> permissionList = new ArrayList<>();
        // 遍历每一个申请的权限,把没有通过的权限放在集合中
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(MainActivity.this, permission) !=
                    PackageManager.PERMISSION_GRANTED) {
                permissionList.add(permission);
            } else {
                mListener.granted();
            }
        }
        // 申请权限
        if (!permissionList.isEmpty()) {
            ActivityCompat.requestPermissions(MainActivity.this,
                    permissionList.toArray(new String[permissionList.size()]), 1);
        }
    }

也可以直接手动给权限(我就是直接在真机中给相应的权限进行操作的)重要的是读取

  1. 读取该用户的所有电话号码

最开始的代码:



 //遍历-获取每一个通讯者的相关信息
        while(cursor.moveToNext()){
            Map man = new HashMap();
            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            man.put("name",name);
            String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            Cursor cursor_phone = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, ContactsContract.CommonDataKinds.Phone._ID +"=?" ,new String[]{id},null);
           ArrayList<String> phones = new ArrayList<>();
            while(cursor_phone.moveToNext()){
                String phone = cursor_phone.getString(cursor_phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER));
                if(phone != null){
                    phones.add(phone);
                }
            }
            man.put("phones",phones);
            contracts.add(man);
        }

这个我是按照网上的教程一步步走下去的,但是并不理想!在debug的时候发现phones就是空的!

初步认定是在内容提供器中没有读取到我想要的数据;

故尝试参考资料1-用list存放该用户下的多个电话号码 中,改写其中的查询代码。修改完后的代码:的确是这个query的问题。已解决!

 //遍历-获取每一个通讯者的相关信息
        while(cursor.moveToNext()){
            Map man = new HashMap();
            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            man.put("name",name);
            String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.NAME_RAW_CONTACT_ID));
            Cursor cursor_phone = resolver.query(ContactsContract.Data.CONTENT_URI,null, ContactsContract.Contacts.Entity.RAW_CONTACT_ID +"=?" ,new String[]{id},null);
           ArrayList<String> phones = new ArrayList<>();
            while(cursor_phone.moveToNext()){
                String phone = cursor_phone.getString(cursor_phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER));
                if(phone != null){
                    phones.add(phone);
                }
            }
            man.put("phones",phones);
            contracts.add(man);
        }
  1. 出现其他的权限错误

java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/contacts from pid=483, uid=10290 requires android.permission.READ_CONTACTS, or grantUriPermission()
原来是我的Permission 写错了!还是要仔细——我少写了Read的权限!正确如下:

//这个最好动态申请权限;这样的用户交互才会有一定的效果!
    private static String[] PERMISSIONS = {
            "android.permission.READ_CONTACTS",
            "android.permission.WRITE_CONTACTS"
    };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值