一、权限:
在Android系统中,访问通讯录需要相应的权限。从Android 6.0(API 23)开始,权限被划分为正常权限和敏感权限,访问通讯录属于敏感权限,因此需要动态申请。
首先,在你的AndroidManifest.xml中添加权限声明:
<!--允许应用程序写出到联系人-->
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<!--允许应用程序读取到联系人-->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
然后,在Activity代码中检查和请求权限:
private static final int MY_PERMISSIONS_REQUEST_CODE = 1;
// 判断当前是否有权限
if (ContextCompat.checkSelfPermission(TwoActivity.this, android.Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(TwoActivity.this, new String[]{android.Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS}, MY_PERMISSIONS_REQUEST_CODE);
} else {
// 权限已被授权,执行操作
}
//权限请求结果的回调方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_CODE:
// 结果是授予权限则读取联系人列表
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限被授予,执行操作
} else {
Toast.makeText(this, "you denied the permission", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
二、通讯录数据库表
Android通讯录主要包括以下几个表:
-
ContactsContract.Contacts表:表示不同联系人的行,基于聚合的原始联系人行。这个表保存了本机保存的所有联系人,每个联系人占一行,包含了联系人的基本信息,如ContactID、联系次数、最后一次联系的时间、是否含有号码、是否被添加到收藏夹等信息。
-
ContactsContract.RawContacts表:包含联系人数据摘要的行,针对特定用户帐户和类型。这个表保存了所有创建过的手机联系人,每个联系人占一行,表里有一列标识该联系人是否被删除,保存了联系人的RawContactID、ContactID、联系次数、最后一次联系的时间、是否被添加到收藏夹、显示的名字、用于排序的汉语拼音等信息。
-
ContactsContract.Data表:包含原始联系人详细信息(例如电子邮件地址或电话号码)的行。这个表保存了所有创建过的手机联系人的所有信息,每个字段占一行,通过MimeTypeID和RawContactID与RawContacts表和Mimetypes表联系起来。联系人的所有信息保存在列data1至data15中,各列中保存的内容根据MimeTypeID的不同而不同。
-
Mimetypes表:定义了所有的MimeTypeID,即联系人的各个字段的唯一标志。这个表列出了不同的数据类型,如电子邮件、电话号码、姓名等,通过MimeTypeID的值来区分不同行数据的真实类型。
关于联系人的一些URI
管理联系人的Uri:
ContactsContract.Contacts.CONTENT_URI
管理联系人的电话的Uri:
ContactsContract.CommonDataKinds.Phone.CONTENT_URI
管理联系人的Email的Uri:
ContactsContract.CommonDataKinds.Email.CONTENT_URI
(注:Contacts有两个表,分别是rawContact和Data,
rawContact记录了用户的id和name,
其中id栏名称为:ContactsContract.Contacts._ID,
name名称栏为 :ContactContract.Contracts.DISPLAY_NAME,
其余的电话、Email信息都在Data表:
电话信息表的外键id为:ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
电话号码栏名称为:ContactsContract.CommonDataKinds.Phone.NUMBER.
data表中Email地址栏名称为:
ContactsContract.CommonDataKinds.Email.DATA
其外键栏为:ContactsContract.CommonDataKinds.Email.CONTACT_ID)
三、通讯录的增删改查
@SuppressLint("Range")
public void query() {
Cursor cursor = null;
try {
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; //Data表查询 联系人电话Uri;
cursor = getContentResolver().query(uri, null, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Log.d(TAG, "联系人:${displayName}"+displayName+"---电话:${number}"+number);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
public void insert() {
String name = "season";
String phone = "123456789101";
//首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
ContentValues values = new ContentValues();
Uri uri = getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values);
long rawContentID = ContentUris.parseId(uri);
//往data表入姓名数据
values.clear();
values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContentID);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
//往data表入电话数据
values.clear();
values.put(ContactsContract.Data.RAW_CONTACT_ID, rawContentID);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
}
public void update() {
String name_update = "season";
String phone_update = "111";
Long rawContactId = 0L;
ContentResolver resolver = getContentResolver();
ContentValues values1 = new ContentValues();
values1.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone_update);
if (!name_update.equals("")) {
Cursor cursor2 = getContentName(name_update);
if (cursor2.moveToFirst()) {
rawContactId = cursor2.getLong(0);
}
resolver.update(ContactsContract.Data.CONTENT_URI, values1, "mimetype=? and raw_contact_id=?"
, new String[]{ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE, rawContactId + ""});
cursor2.close();
}
}
private Cursor getContentName(String name_search) {
Cursor cursor = getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + "=?", new String[]{name_search}, null);
return cursor;
}
public void delete() {
getContentResolver().delete(ContactsContract.Data.CONTENT_URI,null,null);
}
}
网友评论