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);
}
}
}
这里获取的是用户点击了 某个通讯录中的某个人 返回的电话号码 和 姓名