Android打开通讯录并获取数据

Android打开通讯录并获取数据


一、AndroidManifest中权限配置


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

二、 配置动态权限

     //**版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取**
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             //ContextCompat.checkSelfPermission() 方法 指定context和某个权限 返回PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED
             if (ContextCompat.checkSelfPermission(NewAdd4Activity.this, android.Manifest.permission.READ_CONTACTS)
                     != PackageManager.PERMISSION_GRANTED) {   
                     // 若不为GRANTED(即为DENIED)则要申请权限了
                     // 申请权限 第一个为context 第二个可以指定多个请求的权限 第三个参数为请求码
                 ActivityCompat.requestPermissions(NewAdd4Activity.this,        
                         new String[]{android.Manifest.permission.READ_CONTACTS},
                         GlobalVariable.READ_REQUEST_CONTACTS);
             } else { 
             //权限已经被授予,在这里直接写要执行的相应方法即可
                 intentToContact();
             }
         }else { 
         // 低于6.0的手机直接访问
             intentToContact();
         }

三、 权限回调处理

 // 用户权限 申请 的回调方法
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String permissions[], @NonNull int[] grantResults) {
        if(requestCode== GlobalVariable.READ_REQUEST_CONTACTS) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                intentToContact();
            } else {
                Toast.makeText(NewAdd4Activity.this,"授权被禁止",Toast.LENGTH_SHORT).show();
            }
        }
        super.onRequestPermissionsResult(requestCode, permissions,
                grantResults);
    }

四、打开通讯录

private void intentToContact() {
        // 跳转到联系人界面
        Intent intent = new Intent();
        intent.setAction("android.intent.action.PICK");
        intent.addCategory("android.intent.category.DEFAULT");
        intent.setType("vnd.android.cursor.dir/phone_v2");
        startActivityForResult(intent, 0x30);
    }

五、 获取回调 处理数据

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode==0x30) {
            if (data != null) {
                Uri uri = data.getData();
                String phoneNum = null;
                String contactName = null;
                // 创建内容解析者
                ContentResolver contentResolver = getContentResolver();
                Cursor cursor = null;
                if (uri != null) {
                    cursor = contentResolver.query(uri,
                            new String[]{"display_name","data1"}, null, null, null);
                }
                while (cursor.moveToNext()) {
                    contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    phoneNum = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                }
                cursor.close();
                //  把电话号码中的  -  符号 替换成空格
                if (phoneNum != null) {
                    phoneNum = phoneNum.replaceAll("-", " ");
                    // 空格去掉  为什么不直接-替换成"" 因为测试的时候发现还是会有空格 只能这么处理
                    phoneNum= phoneNum.replaceAll(" ", "");
                }

                editCustomerName.setText(contactName);
                editContact.setText(phoneNum);
            }
        }
     }

这里获取的是用户点击了 某个通讯录中的某个人 返回的电话号码 和 姓名


你可能感兴趣的:(android)