项目说明:
基于recycleview,读取数据库 对联系人进行增删改
本次更新主要是完善联系人界面,从本机数据库中获取联系人并显示出来,以及增加添加联系人的button将添加的联系人保存到系统库中。
源码地址:https://gitee.com/zoey_huang/wechat.git
运行截图:
手机联系人数据库contacts2.db位置:
手机系统目录data/data下的包com.android.providers.contacts里
模拟机可以在Device File Explorer里面看到
数据库contacts2.db里包含表raw_contacts,联系人id存放在字段contact_id里。表data存放联系人的具体信息;表contacts存放联系人的其他信息。
URI
android.provider.
ContactsContract的
内部类Contacts
提供了访问手机联系人数据库的
Uri—
ContactsContract.Contacts.CONTENT_URI
。通过这个
Uri
,可以访问手机所有人的相关信息。
权限
系统数据库的读写操作,需要授权。
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
需要动态申请:
// 给予权限
int hasWriteContactsPermisson = ContextCompat.checkSelfPermission(view.getContext(), Manifest.permission.READ_CONTACTS);
if(hasWriteContactsPermisson != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.WRITE_CONTACTS}, 1);
}
布局:
加上悬浮按钮。
展开后:
悬浮按钮操作
//悬浮按钮点击操作
FloatingActionButton fab = view.findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View view) {
final View resultDialog = getActivity().getLayoutInflater().inflate(R.layout.top_btn_add, null); // 设置成final,否则String name = ((EditText) resultDialog.findViewById(R.id.name)).getText().toString();报EditText空指针错误
// 使用对话框来显示查询结果
AlertDialog show = new AlertDialog.Builder(view.getContext())
.setView(resultDialog)
.setTitle("Add your contact")
.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 获取程序界面中的三个文本框的内容
String name = ((EditText) resultDialog.findViewById(R.id.name)).getText().toString();
String phone = ((EditText) resultDialog.findViewById(R.id.phone)).getText().toString();
String email = ((EditText) resultDialog.findViewById(R.id.email)).getText().toString();
// 创建一个空的ContentValues
ContentValues values = new ContentValues();
// 向RawContacts.CONTENT_URI执行一个空值插入
// 目的是获取系统返回的rawContactId
Uri rawContactUri = getActivity().getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(rawContactUri);
values.clear();
values.put(ContactsContract.RawContacts.Data.RAW_CONTACT_ID, rawContactId);
// 设置内容类型
values.put(ContactsContract.RawContacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
// 设置联系人名字
values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name);
// 向联系人URI添加联系人名字
getActivity().getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
values.clear();
values.put(ContactsContract.RawContacts.Data.RAW_CONTACT_ID, rawContactId);
values.put(ContactsContract.RawContacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
// 设置联系人的电话号码
values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone);
// 设置电话类型
values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
// 向联系人电话号码URI添加电话号码
getActivity().getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
values.clear();
values.put(ContactsContract.RawContacts.Data.RAW_CONTACT_ID, rawContactId);
values.put(ContactsContract.RawContacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
// 设置联系人的E-mail地址
values.put(ContactsContract.CommonDataKinds.Email.DATA, email);
// 设置该电子邮件的类型
values.put(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK);
// 向联系人E-mail URI添加E-mail数据
getActivity().getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
Toast.makeText(view.getContext(), "联系人添加成功", Toast.LENGTH_SHORT).show();
PersonData personData = new PersonData();
personData.setName(name);
personData.setPhoneNumber(phone);
personData.setEmailAddress(email);
mDataList.add(personData);
mList.add("");
adapter.notifyDataSetChanged();
}
})
.setNegativeButton("取消", null).show();
}
});
获取联系人数据:
private void viewShow() { // 将系统联系人中的数据
Cursor cursor = getActivity().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,// 使用ContentResolver查找联系人数据
null, null,
null, null);
while (cursor.moveToNext()) {
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));// 获取联系人ID
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));// 获取联系人的名字
Cursor phones = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,// 使用ContentResolver查找联系人的电话号码
null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId,
null, null);
String phoneNumber = "";
while (phones.moveToNext()) {// 遍历查询结果,获取该联系人的多个电话号码
phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));// 获取查询结果中电话号码列中数据
}
phones.close();
Cursor emails = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,// 使用ContentResolver查找联系人的E-mail地址
null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,
null, null);
String emailAddress = "";
while (emails.moveToNext()) {// 遍历查询结果,获取该联系人的多个E-mail地址
emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));// 获取查询结果中E-mail地址列中数据
}
emails.close();
mList.add(name + "| " + phoneNumber + "| " + emailAddress);
}
cursor.close();
initData();
}