android电话本机制.docx
- 文档编号:26456252
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:32
- 大小:143.62KB
android电话本机制.docx
《android电话本机制.docx》由会员分享,可在线阅读,更多相关《android电话本机制.docx(32页珍藏版)》请在冰豆网上搜索。
android电话本机制
一.前言
1.1Android的电话本的机制.
Android的电话本通过contentProvider封装好的。
我们只要通过sdk提供的Uri和字段来对其进行增、删、改、查。
1.2权限
viewplaincopytoclipboardprint?
1. name="android.permission.WRITE_CONTACTS">
2. name="android.permission.READ_CONTACTS">
[html]viewplaincopyprint?
1. name="android.permission.WRITE_CONTACTS">
2. name="android.permission.READ_CONTACTS">
1.3找到ContentProvider维护的Sqlist数据库文件(.db)
ContentProvider其实自己管理一个Sqlist数据库文件(.db)。
这个文件的路径为/data/data/com.android.providers.contacts/databases/contacts2.db。
如图:
1.4查看ContentProvider维护的Sqlist数据库文件(.db)
在模拟器中的电话本里创建几个联系人,打开1.2中的.db文件,可以用数据库查看工具SQLiteExpertProfessional打开看下,如图:
从上图,可以看出左边是.db文件的表,点开各表后可以看出主要的表有raw_contacts,contacts,data
二.api
2.1三张主表.
从api中可以看到android.provider.ContactsContract是sdk2.0的类库,从api和上面的图都可以看出关于电话本主要信息都存在 ContactsContract.Data, ContactsContract.RawContacts, ContactsContract.Contacts 三张表里
2.1.1以上三张表的关联关系.
ContactsContract.Data,ContactsContract.RawContacts,ContactsContract.Contacts三张表的关联,
ContactsContract.RawContacts表里包含ContactsContract.Contacts的contact_id;ContactsContract.Data表里有ContactsContract.RawContacts的raw_contact_id,和ContactsContract.Contacts的contact_id
2.2各数据对应的类库,电话本各字段的数据结构
2.2.1Email对应ContactsContract.CommonDataKinds.Email
Type
Alias
Datacolumn
String
ADDRESS
DATA1
Emailaddressitself.
int
TYPE
DATA2
Allowedvaluesare:
∙TYPE_CUSTOM.Puttheactualtypein LABEL.
∙TYPE_HOME
∙TYPE_WORK
∙TYPE_OTHER
∙TYPE_MOBILE
String
LABEL
DATA3
Email数据有三个字段存储:
ADDRESS为Email值;TYPE为类型,当为自定义(TYPE_CUSTOM)时,LABEL字段要写入用户自定义的类型;
2.2.2IM对应 ContactsContract.CommonDataKinds.Im
Type
Alias
Datacolumn
String
DATA
DATA1
int
TYPE
DATA2
Allowedvaluesare:
∙TYPE_CUSTOM.Puttheactualtypein LABEL.
∙TYPE_HOME
∙TYPE_WORK
∙TYPE_OTHER
String
LABEL
DATA3
String
PROTOCOL
DATA5
Allowedvalues:
∙PROTOCOL_CUSTOM.Alsoprovidetheactualprotocolnameas CUSTOM_PROTOCOL.
∙PROTOCOL_AIM
∙PROTOCOL_MSN
∙PROTOCOL_YAHOO
∙PROTOCOL_SKYPE
∙PROTOCOL_QQ
∙PROTOCOL_GOOGLE_TALK
∙PROTOCOL_ICQ
∙PROTOCOL_JABBER
∙PROTOCOL_NETMEETING
String
CUSTOM_PROTOCOL
DATA6
Im有5个字段
2.2.3Phone对应 ContactsContract.CommonDataKinds.Phone
Type
Alias
Datacolumn
String
NUMBER
DATA1
int
TYPE
DATA2
Allowedvaluesare:
∙TYPE_CUSTOM.Puttheactualtypein LABEL.
∙TYPE_HOME
∙TYPE_MOBILE
∙TYPE_WORK
∙TYPE_FAX_WORK
∙TYPE_FAX_HOME
∙TYPE_PAGER
∙TYPE_OTHER
∙TYPE_CALLBACK
∙TYPE_CAR
∙TYPE_COMPANY_MAIN
∙TYPE_ISDN
∙TYPE_MAIN
∙TYPE_OTHER_FAX
∙TYPE_RADIO
∙TYPE_TELEX
∙TYPE_TTY_TDD
∙TYPE_WORK_MOBILE
∙TYPE_WORK_PAGER
∙TYPE_ASSISTANT
∙TYPE_MMS
String
LABEL
DATA3
2.2.4Postaladdress通讯地址对应 ContactsContract.CommonDataKinds.StructuredPostal
Type
Alias
Datacolumn
String
FORMATTED_ADDRESS
DATA1
int
TYPE
DATA2
Allowedvaluesare:
∙TYPE_CUSTOM.Puttheactualtypein LABEL.
∙TYPE_HOME
∙TYPE_WORK
∙TYPE_OTHER
String
LABEL
DATA3
String
STREET
DATA4
String
POBOX
DATA5
PostOfficeBoxnumber
String
NEIGHBORHOOD
DATA6
String
CITY
DATA7
String
REGION
DATA8
String
POSTCODE
DATA9
String
COUNTRY
DATA10
最长用的有TYPE:
类型;STREET:
街道;CITY:
市;REGION:
省;POSTCODE:
邮政编码;
三.代码
3.1根据API写代码.
在api里 ContactsContract.Data和ContactsContract.RawContacts文档里有关于insert,update,delete,query的代码,显示出操作各自的表的代码。
可以根据这些来完成我们自己的逻辑。
3.2查询(查出全部联系人,在只显示姓名)需要如图:
需求分析:
由于列表中只需要姓名,所以在查询表时就只查询出姓名信息就好。
当点击某个联系人再查出Email,phone等详细信息。
3.2.1查询联系人总表代码:
说明:
由于姓名可以直接在ContactsContract.Contacts表里查到,所以如下
viewplaincopytoclipboardprint?
1.public static final String[] PROJECTION_CONTACTS = { Contacts._ID,
2. Contacts.PHOTO_ID, Contacts.IN_VISIBLE_GROUP,
3. Contacts.HAS_PHONE_NUMBER, Contacts.DISPLAY_NAME,
4. Contacts.CUSTOM_RINGTONE };
5.
6. /**
7. * wu0wu
8. *
9. * 功能:
查询所有联系人PROJECTION_CONTACTS信息
10. *
11. * */
12. public static void _getContacts(ContentResolver cr) {
13. Cursor cursorContact = null;
14.
15. try {
16. cursorContact = cr.query(ContactsContract.Contacts.CONTENT_URI,
17. PROJECTION_CONTACTS, Contacts.IN_VISIBLE_GROUP + "=1",
18. null, null);
19. Log.e("wu0wu", "联系人个数=" + cursorContact.getCount());
20. int[] indexs = getColumnIndexs(PROJECTION_CONTACTS, cursorContact);
21.
22. while (cursorContact.moveToNext()) {
23. Log.e("wu0wu", "------------------------------------");
24. for (int i = 0; i < PROJECTION_CONTACTS.length; i++) {
25. String value = cursorContact.getString(indexs[i]);
26. Log.e("wu0wu", PROJECTION_CONTACTS[i] + "=" + value);
27. }
28. }
29. } catch (Exception e) {
30. Log.e("wu0wu", e.toString());
31. } finally {
32. if (cursorContact !
= null) {
33. cursorContact.close();
34. }
35. }
36. }
37.
38. private static int[] getColumnIndexs(String[] projections, Cursor c) {
39. int[] ret = new int[projections.length];
40. for (int i = 0; i < projections.length; i++) {
41. ret[i] = c.getColumnIndex(projections[i]);
42. }
43. return ret;
44. }
[java]viewplaincopyprint?
1.public static final String[] PROJECTION_CONTACTS = { Contacts._ID,
2. Contacts.PHOTO_ID, Contacts.IN_VISIBLE_GROUP,
3. Contacts.HAS_PHONE_NUMBER, Contacts.DISPLAY_NAME,
4. Contacts.CUSTOM_RINGTONE };
5.
6. /**
7. * wu0wu
8. *
9. * 功能:
查询所有联系人PROJECTION_CONTACTS信息
10. *
11. * */
12. public static void _getContacts(ContentResolver cr) {
13. Cursor cursorContact = null;
14.
15. try {
16. cursorContact = cr.query(ContactsContract.Contacts.CONTENT_URI,
17. PROJECTION_CONTACTS, Contacts.IN_VISIBLE_GROUP + "=1",
18. null, null);
19. Log.e("wu0wu", "联系人个数=" + cursorContact.getCount());
20. int[] indexs = getColumnIndexs(PROJECTION_CONTACTS, cursorContact);
21.
22. while (cursorContact.moveToNext()) {
23. Log.e("wu0wu", "------------------------------------");
24. for (int i = 0; i < PROJECTION_CONTACTS.length; i++) {
25. String value = cursorContact.getString(indexs[i]);
26. Log.e("wu0wu", PROJECTION_CONTACTS[i] + "=" + value);
27. }
28. }
29. } catch (Exception e) {
30. Log.e("wu0wu", e.toString());
31. } finally {
32. if (cursorContact !
= null) {
33. cursorContact.close();
34. }
35. }
36. }
37.
38. private static int[] getColumnIndexs(String[] projections, Cursor c) {
39. int[] ret = new int[projections.length];
40. for (int i = 0; i < projections.length; i++) {
41. ret[i] = c.getColumnIndex(projections[i]);
42. }
43. return ret;
44. }
3.2.2根据contactId查询联系人详细
viewplaincopytoclipboardprint?
1.// phone
2. private static final String[] PROJECTION_PHONENUMBER_CONTACT = {
3. Phone.NUMBER, Phone.TYPE, Phone.LABEL };
4. /* DISPLAY_NAME唯一性 */
5. private static final String[] PROJECTION_DISPLAYNAME_CONTACT = { StructuredName.DISPLAY_NAME };
6. // Email
7. private static final String[] PROJECTION_EAMIL_CONTACT = { Email.DATA1,
8. Email.TYPE, Email.LABEL };
9. // IM
10. private static final String[] PROJECTION_IM_CONTACT = new String[] {
11. Im.DATA, Im.TYPE, Im.LABEL, Im.PROTOCOL };
12. // address
13. private static final String[] PROJECTION_ADDRESS_CONTACT = new String[] {
14. StructuredPostal.STREET, StructuredPostal.CITY,
15. StructuredPostal.REGION, StructuredPostal.POSTCODE,
16. StructuredPostal.COUNTRY, StructuredPostal.TYPE,
17. StructuredPostal.LABEL, StructuredPostal.POBOX,
18. StructuredPostal.NEIGHBORHOOD, };
19. // Organization
20. private static final String[] PROJECTION_ORGANIZATION_CONTACT = new String[] {
21. Organization.COMPANY, Organization.TYPE, Organization.LABEL,
22. Organization.TITLE };
23. // note
24. private static final String[] PROJECTION_NOTES_CONTACT = new String[] { Note.NOTE };
25. // nickname
26. private static final String[] PROJECTION_NICKNAMES_CONTACT = new String[] {
27. Nickname.NAME, Nickname.TYPE, Nickname.LABEL };
28. // website
29. private static final String[] PROJECTION_WEBSITES_CONTACT = new String[] {
30. Website.URL, Website.TYPE, Website.LABEL };
31.
32. /**
33. * 功能:
根据contactId查询联系人详细
34. *
35. * 在android.provider.ContactsContract.Data表里查询
36. * */
37. public static void _getContactByContactId(ContentResolver cr,
38. String contactId) {
39. Cursor c = null;
40.
41. c = cr.query(Data.CONTENT_URI, null, Data.CONTACT_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 电话本 机制