一.前言

1.1 Android的电话本的机制.

Android的电话本通过contentProvider封装好的。我们只要通过sdk提供的Uri和字段来对其进行增、删、改、查。

1.2 权限

view plain copy to clipboard print ?
  1. <uses-permissionandroid:name="android.permission.WRITE_CONTACTS"></uses-permission>
  2. <uses-permissionandroid:name="android.permission.READ_CONTACTS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission> <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

1.3 找到ContentProvider维护的Sqlist数据库文件( .db)

ContentProvider其实自己管理一个Sqlist数据库文件( .db)。这个文件的路径为/data/data/com.android.providers.contacts/databases/contacts2.db。如图:

android 联系人 增删改查_第1张图片


1.4 查看ContentProvider维护的Sqlist数据库文件( .db)

在模拟器中的电话本里创建几个联系人,打开1.2中的.db文件,可以用数据库查看工具SQLite Expert Professional打开看下,如图:

android 联系人 增删改查_第2张图片

从上图,可以看出左边是.db文件的表,点开各表后可以看出主要的表有raw_contacts,contacts,data


二. api

2.1 三张主表.

从api中可以看到android.provider.ContactsContract是sdk2.0的类库,从api和上面的图都可以看出关于电话本主要信息都存在ContactsContract.DataContactsContract.RawContactsContactsContract.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.1 Email 对应ContactsContract.CommonDataKinds.Email

Type Alias Data column
String ADDRESS DATA1 Email address itself.
int TYPE DATA2 Allowed values are:

  • TYPE_CUSTOM. Put the actual type inLABEL.
  • TYPE_HOME
  • TYPE_WORK
  • TYPE_OTHER
  • TYPE_MOBILE

String LABEL DATA3
Email数据有三个字段存储:ADDRESS为Email值;TYPE为类型,当为自定义(TYPE_CUSTOM)时,LABEL字段要写入用户自定义的类型;

2.2.2 IM 对应ContactsContract.CommonDataKinds.Im

Type Alias Data column
String DATA DATA1
int TYPE DATA2 Allowed values are:

  • TYPE_CUSTOM. Put the actual type inLABEL.
  • TYPE_HOME
  • TYPE_WORK
  • TYPE_OTHER

String LABEL DATA3
String PROTOCOL DATA5

Allowed values:

  • PROTOCOL_CUSTOM. Also provide the actual protocol name asCUSTOM_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.3 Phone 对应ContactsContract.CommonDataKinds.Phone

Type Alias Data column
String NUMBER DATA1
int TYPE DATA2 Allowed values are:

  • TYPE_CUSTOM. Put the actual type inLABEL.
  • 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.4 Postal address 通讯地址 对应ContactsContract.CommonDataKinds.StructuredPostal

Type Alias Data column
String FORMATTED_ADDRESS DATA1
int TYPE DATA2 Allowed values are:

  • TYPE_CUSTOM. Put the actual type inLABEL.
  • TYPE_HOME
  • TYPE_WORK
  • TYPE_OTHER

String LABEL DATA3
String STREET DATA4
String POBOX DATA5 Post Office Box number
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 查询 (查出全部联系人,在只显示姓名)需要如图:

android 联系人 增删改查_第3张图片

需求分析:由于列表中只需要姓名,所以在查询表时就只查询出姓名信息就好。当点击某个联系人再查出Email,phone等详细信息。

3.2.1 查询联系人总表代码:

说明:由于姓名可以直接在ContactsContract.Contacts表里查到,所以如下

view plain copy to clipboard print ?
  1. publicstaticfinalString[]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. *wu0wu
  7. *
  8. *功能:查询所有联系人PROJECTION_CONTACTS信息
  9. *
  10. **/
  11. publicstaticvoid_getContacts(ContentResolvercr){
  12. CursorcursorContact=null;
  13. try{
  14. cursorContact=cr.query(ContactsContract.Contacts.CONTENT_URI,
  15. PROJECTION_CONTACTS,Contacts.IN_VISIBLE_GROUP+"=1",
  16. null,null);
  17. Log.e("wu0wu","联系人个数="+cursorContact.getCount());
  18. int[]indexs=getColumnIndexs(PROJECTION_CONTACTS,cursorContact);
  19. while(cursorContact.moveToNext()){
  20. Log.e("wu0wu","------------------------------------");
  21. for(inti=0;i<PROJECTION_CONTACTS.length;i++){
  22. Stringvalue=cursorContact.getString(indexs[i]);
  23. Log.e("wu0wu",PROJECTION_CONTACTS[i]+"="+value);
  24. }
  25. }
  26. }catch(Exceptione){
  27. Log.e("wu0wu",e.toString());
  28. }finally{
  29. if(cursorContact!=null){
  30. cursorContact.close();
  31. }
  32. }
  33. }
  34. privatestaticint[]getColumnIndexs(String[]projections,Cursorc){
  35. int[]ret=newint[projections.length];
  36. for(inti=0;i<projections.length;i++){
  37. ret[i]=c.getColumnIndex(projections[i]);
  38. }
  39. returnret;
  40. }
public static final String[] PROJECTION_CONTACTS = { Contacts._ID, Contacts.PHOTO_ID, Contacts.IN_VISIBLE_GROUP, Contacts.HAS_PHONE_NUMBER, Contacts.DISPLAY_NAME, Contacts.CUSTOM_RINGTONE }; /** * wu0wu * * 功能:查询所有联系人PROJECTION_CONTACTS信息 * * */ public static void _getContacts(ContentResolver cr) { Cursor cursorContact = null; try { cursorContact = cr.query(ContactsContract.Contacts.CONTENT_URI, PROJECTION_CONTACTS, Contacts.IN_VISIBLE_GROUP + "=1", null, null); Log.e("wu0wu", "联系人个数=" + cursorContact.getCount()); int[] indexs = getColumnIndexs(PROJECTION_CONTACTS, cursorContact); while (cursorContact.moveToNext()) { Log.e("wu0wu", "------------------------------------"); for (int i = 0; i < PROJECTION_CONTACTS.length; i++) { String value = cursorContact.getString(indexs[i]); Log.e("wu0wu", PROJECTION_CONTACTS[i] + "=" + value); } } } catch (Exception e) { Log.e("wu0wu", e.toString()); } finally { if (cursorContact != null) { cursorContact.close(); } } } private static int[] getColumnIndexs(String[] projections, Cursor c) { int[] ret = new int[projections.length]; for (int i = 0; i < projections.length; i++) { ret[i] = c.getColumnIndex(projections[i]); } return ret; }

3.2.2 根据contactId查询联系人详细

view plain copy to clipboard print ?
  1. //phone
  2. privatestaticfinalString[]PROJECTION_PHONENUMBER_CONTACT={
  3. Phone.NUMBER,Phone.TYPE,Phone.LABEL};
  4. /*DISPLAY_NAME唯一性*/
  5. privatestaticfinalString[]PROJECTION_DISPLAYNAME_CONTACT={StructuredName.DISPLAY_NAME};
  6. //Email
  7. privatestaticfinalString[]PROJECTION_EAMIL_CONTACT={Email.DATA1,
  8. Email.TYPE,Email.LABEL};
  9. //IM
  10. privatestaticfinalString[]PROJECTION_IM_CONTACT=newString[]{
  11. Im.DATA,Im.TYPE,Im.LABEL,Im.PROTOCOL};
  12. //address
  13. privatestaticfinalString[]PROJECTION_ADDRESS_CONTACT=newString[]{
  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. privatestaticfinalString[]PROJECTION_ORGANIZATION_CONTACT=newString[]{
  21. Organization.COMPANY,Organization.TYPE,Organization.LABEL,
  22. Organization.TITLE};
  23. //note
  24. privatestaticfinalString[]PROJECTION_NOTES_CONTACT=newString[]{Note.NOTE};
  25. //nickname
  26. privatestaticfinalString[]PROJECTION_NICKNAMES_CONTACT=newString[]{
  27. Nickname.NAME,Nickname.TYPE,Nickname.LABEL};
  28. //website
  29. privatestaticfinalString[]PROJECTION_WEBSITES_CONTACT=newString[]{
  30. Website.URL,Website.TYPE,Website.LABEL};
  31. /**
  32. *功能:根据contactId查询联系人详细
  33. *
  34. *在android.provider.ContactsContract.Data表里查询
  35. **/
  36. publicstaticvoid_getContactByContactId(ContentResolvercr,
  37. StringcontactId){
  38. Cursorc=null;
  39. c=cr.query(Data.CONTENT_URI,null,Data.CONTACT_ID+"=?",
  40. newString[]{contactId},null);
  41. StringmimeType=null;
  42. String[]contentValue=null;
  43. ArrayList<String[]>displayNameList=newArrayList<String[]>();//存显示名
  44. ArrayList<String[]>phoneList=newArrayList<String[]>();//存电话号码,可多个
  45. ArrayList<String[]>emailList=newArrayList<String[]>();//存Email,可多个
  46. ArrayList<String[]>imList=newArrayList<String[]>();//存im,可多个
  47. ArrayList<String[]>postalList=newArrayList<String[]>();//存postal地址,可多个
  48. ArrayList<String[]>organizationList=newArrayList<String[]>();//存organization组织,可多个
  49. ArrayList<String[]>noteList=newArrayList<String[]>();//存note备注
  50. ArrayList<String[]>nicknameList=newArrayList<String[]>();//存Nickname昵称
  51. ArrayList<String[]>websiteList=newArrayList<String[]>();//存Website网站
  52. while(c.moveToNext()){
  53. //根据mimeType分类信息
  54. mimeType=c.getString(c.getColumnIndex(Data.MIMETYPE));
  55. if(StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)){
  56. contentValue=MyUtils.getStringInContactCursor(c,
  57. PROJECTION_DISPLAYNAME_CONTACT);
  58. displayNameList.add(contentValue);
  59. }elseif(Phone.CONTENT_ITEM_TYPE.equals(mimeType)){
  60. //每个contentValue存一类PROJECTION_PHONENUMBER_CONTACT数据
  61. contentValue=MyUtils.getStringInContactCursor(c,
  62. PROJECTION_PHONENUMBER_CONTACT);
  63. phoneList.add(contentValue);
  64. }elseif(Email.CONTENT_ITEM_TYPE.equals(mimeType)){
  65. contentValue=MyUtils.getStringInContactCursor(c,
  66. PROJECTION_EAMIL_CONTACT);
  67. emailList.add(contentValue);
  68. }elseif(Im.CONTENT_ITEM_TYPE.equals(mimeType)){
  69. contentValue=MyUtils.getStringInContactCursor(c,
  70. PROJECTION_IM_CONTACT);
  71. imList.add(contentValue);
  72. }elseif(StructuredPostal.CONTENT_ITEM_TYPE.equals(mimeType)){
  73. contentValue=MyUtils.getStringInContactCursor(c,
  74. PROJECTION_ADDRESS_CONTACT);
  75. postalList.add(contentValue);
  76. }elseif(Organization.CONTENT_ITEM_TYPE.equals(mimeType)){
  77. contentValue=MyUtils.getStringInContactCursor(c,
  78. PROJECTION_ORGANIZATION_CONTACT);
  79. organizationList.add(contentValue);
  80. }elseif(Note.CONTENT_ITEM_TYPE.equals(mimeType)){
  81. contentValue=MyUtils.getStringInContactCursor(c,
  82. PROJECTION_NOTES_CONTACT);
  83. noteList.add(contentValue);
  84. }elseif(Nickname.CONTENT_ITEM_TYPE.equals(mimeType)){
  85. contentValue=MyUtils.getStringInContactCursor(c,
  86. PROJECTION_NICKNAMES_CONTACT);
  87. nicknameList.add(contentValue);
  88. }elseif(Website.CONTENT_ITEM_TYPE.equals(mimeType)){
  89. contentValue=MyUtils.getStringInContactCursor(c,
  90. PROJECTION_WEBSITES_CONTACT);
  91. websiteList.add(contentValue);
  92. }
  93. }
  94. c.close();
  95. //log
  96. MyUtils.logContactsDetails("displayName",PROJECTION_DISPLAYNAME_CONTACT,displayNameList);
  97. MyUtils.logContactsDetails("phoneNumber",PROJECTION_PHONENUMBER_CONTACT,phoneList);
  98. MyUtils.logContactsDetails("Email",PROJECTION_EAMIL_CONTACT,emailList);
  99. MyUtils.logContactsDetails("IM",PROJECTION_IM_CONTACT,imList);
  100. MyUtils.logContactsDetails("Address",PROJECTION_ADDRESS_CONTACT,postalList);
  101. MyUtils.logContactsDetails("Organization",PROJECTION_ORGANIZATION_CONTACT,organizationList);
  102. MyUtils.logContactsDetails("Note",PROJECTION_NOTES_CONTACT,noteList);
  103. MyUtils.logContactsDetails("NickName",PROJECTION_NICKNAMES_CONTACT,nicknameList);
  104. MyUtils.logContactsDetails("WebSit",PROJECTION_WEBSITES_CONTACT,websiteList);
  105. }
// phone private static final String[] PROJECTION_PHONENUMBER_CONTACT = { Phone.NUMBER, Phone.TYPE, Phone.LABEL }; /* DISPLAY_NAME唯一性 */ private static final String[] PROJECTION_DISPLAYNAME_CONTACT = { StructuredName.DISPLAY_NAME }; // Email private static final String[] PROJECTION_EAMIL_CONTACT = { Email.DATA1, Email.TYPE, Email.LABEL }; // IM private static final String[] PROJECTION_IM_CONTACT = new String[] { Im.DATA, Im.TYPE, Im.LABEL, Im.PROTOCOL }; // address private static final String[] PROJECTION_ADDRESS_CONTACT = new String[] { StructuredPostal.STREET, StructuredPostal.CITY, StructuredPostal.REGION, StructuredPostal.POSTCODE, StructuredPostal.COUNTRY, StructuredPostal.TYPE, StructuredPostal.LABEL, StructuredPostal.POBOX, StructuredPostal.NEIGHBORHOOD, }; // Organization private static final String[] PROJECTION_ORGANIZATION_CONTACT = new String[] { Organization.COMPANY, Organization.TYPE, Organization.LABEL, Organization.TITLE }; // note private static final String[] PROJECTION_NOTES_CONTACT = new String[] { Note.NOTE }; // nickname private static final String[] PROJECTION_NICKNAMES_CONTACT = new String[] { Nickname.NAME, Nickname.TYPE, Nickname.LABEL }; // website private static final String[] PROJECTION_WEBSITES_CONTACT = new String[] { Website.URL, Website.TYPE, Website.LABEL }; /** * 功能:根据contactId查询联系人详细 * * 在android.provider.ContactsContract.Data表里查询 * */ public static void _getContactByContactId(ContentResolver cr, String contactId) { Cursor c = null; c = cr.query(Data.CONTENT_URI, null, Data.CONTACT_ID + "=?", new String[] { contactId }, null); String mimeType = null; String[] contentValue = null; ArrayList<String[]> displayNameList = new ArrayList<String[]>();// 存显示名 ArrayList<String[]> phoneList = new ArrayList<String[]>();// 存电话号码,可多个 ArrayList<String[]> emailList = new ArrayList<String[]>();// 存Email,可多个 ArrayList<String[]> imList = new ArrayList<String[]>();// 存im,可多个 ArrayList<String[]> postalList = new ArrayList<String[]>();// 存postal地址,可多个 ArrayList<String[]> organizationList = new ArrayList<String[]>();// 存organization组织,可多个 ArrayList<String[]> noteList = new ArrayList<String[]>();// 存note备注 ArrayList<String[]> nicknameList = new ArrayList<String[]>();// 存Nickname昵称 ArrayList<String[]> websiteList = new ArrayList<String[]>();// 存Website网站 while (c.moveToNext()) { // 根据mimeType分类信息 mimeType = c.getString(c.getColumnIndex(Data.MIMETYPE)); if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) { contentValue = MyUtils.getStringInContactCursor(c, PROJECTION_DISPLAYNAME_CONTACT); displayNameList.add(contentValue); } else if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)) { // 每个contentValue存一类PROJECTION_PHONENUMBER_CONTACT数据 contentValue = MyUtils.getStringInContactCursor(c, PROJECTION_PHONENUMBER_CONTACT); phoneList.add(contentValue); } else if (Email.CONTENT_ITEM_TYPE.equals(mimeType)) { contentValue = MyUtils.getStringInContactCursor(c, PROJECTION_EAMIL_CONTACT); emailList.add(contentValue); } else if (Im.CONTENT_ITEM_TYPE.equals(mimeType)) { contentValue = MyUtils.getStringInContactCursor(c, PROJECTION_IM_CONTACT); imList.add(contentValue); } else if (StructuredPostal.CONTENT_ITEM_TYPE.equals(mimeType)) { contentValue = MyUtils.getStringInContactCursor(c, PROJECTION_ADDRESS_CONTACT); postalList.add(contentValue); } else if (Organization.CONTENT_ITEM_TYPE.equals(mimeType)) { contentValue = MyUtils.getStringInContactCursor(c, PROJECTION_ORGANIZATION_CONTACT); organizationList.add(contentValue); } else if (Note.CONTENT_ITEM_TYPE.equals(mimeType)) { contentValue = MyUtils.getStringInContactCursor(c, PROJECTION_NOTES_CONTACT); noteList.add(contentValue); } else if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType)) { contentValue = MyUtils.getStringInContactCursor(c, PROJECTION_NICKNAMES_CONTACT); nicknameList.add(contentValue); } else if (Website.CONTENT_ITEM_TYPE.equals(mimeType)) { contentValue = MyUtils.getStringInContactCursor(c, PROJECTION_WEBSITES_CONTACT); websiteList.add(contentValue); } } c.close(); // log MyUtils.logContactsDetails("displayName",PROJECTION_DISPLAYNAME_CONTACT, displayNameList); MyUtils.logContactsDetails("phoneNumber",PROJECTION_PHONENUMBER_CONTACT, phoneList); MyUtils.logContactsDetails("Email", PROJECTION_EAMIL_CONTACT,emailList); MyUtils.logContactsDetails("IM", PROJECTION_IM_CONTACT, imList); MyUtils.logContactsDetails("Address", PROJECTION_ADDRESS_CONTACT,postalList); MyUtils.logContactsDetails("Organization",PROJECTION_ORGANIZATION_CONTACT, organizationList); MyUtils.logContactsDetails("Note", PROJECTION_NOTES_CONTACT, noteList); MyUtils.logContactsDetails("NickName", PROJECTION_NICKNAMES_CONTACT,nicknameList); MyUtils.logContactsDetails("WebSit", PROJECTION_WEBSITES_CONTACT,websiteList); }

用到的两个方法:

view plain copy to clipboard print ?
  1. publicstaticString[]getStringInContactCursor(Cursorc,
  2. String[]projection){
  3. String[]contentValue=newString[projection.length];
  4. for(inti=0;i<contentValue.length;i++){
  5. Stringvalue=c.getString(c.getColumnIndex(projection[i]));
  6. if(value==null){
  7. contentValue[i]="";
  8. }else{
  9. contentValue[i]=value;
  10. }
  11. }
  12. returncontentValue;
  13. }
  14. publicstaticvoidlogContactsDetails(Stringtitle,String[]projection,
  15. ArrayList<String[]>data){
  16. Log.e("wu0wu","--------"+title+"--------");
  17. for(inti=0;i<data.size();i++){
  18. for(intj=0;j<data.get(i).length;j++){
  19. Log.e("wu0wu",projection[j]+"="+data.get(i)[j]);
  20. }
  21. }
  22. }
public static String[] getStringInContactCursor(Cursor c, String[] projection) { String[] contentValue = new String[projection.length]; for (int i = 0; i < contentValue.length; i++) { String value = c.getString(c.getColumnIndex(projection[i])); if (value == null) { contentValue[i] = ""; } else { contentValue[i] = value; } } return contentValue; } public static void logContactsDetails(String title, String[] projection, ArrayList<String[]> data) { Log.e("wu0wu", "--------" + title + "--------"); for (int i = 0; i < data.size(); i++) { for (int j = 0; j < data.get(i).length; j++) { Log.e("wu0wu", projection[j] + "=" + data.get(i)[j]); } } }

3.3 新建联系人

接口方法:

view plain copy to clipboard print ?
  1. /**
  2. *新建联系人的接口
  3. *
  4. *@paramString
  5. *accountName,accountType为账号名账号类型,一般为NULL
  6. *@throwsRemoteException
  7. *@throwsOperationApplicationException
  8. */
  9. publicstaticString_insertContact(ContentResolvercr,StringaccountName,
  10. StringaccountType,StringdisplayName,ArrayList<String[]>phone,
  11. ArrayList<String[]>email,ArrayList<String[]>im,
  12. ArrayList<String[]>address,ArrayList<String[]>organization,
  13. ArrayList<String[]>notes,ArrayList<String[]>nickname,
  14. ArrayList<String[]>website)throwsRemoteException,
  15. OperationApplicationException{
  16. ArrayList<ContentProviderOperation>ops=newArrayList<ContentProviderOperation>();
  17. StringrawId="";
  18. longrawContactId=insertRawContact(cr,accountName,accountType);
  19. rawId=Long.toString(rawContactId);
  20. if(displayName!=null){
  21. insertContactDisplayname(ops,StructuredName.CONTENT_ITEM_TYPE,
  22. rawId,displayName);
  23. }
  24. if(phone!=null){
  25. for(intj=0;j<phone.size();j++){
  26. String[]item=phone.get(j);
  27. insertItemToContact(ops,Phone.CONTENT_ITEM_TYPE,rawId,
  28. PROJECTION_PHONENUMBER_CONTACT,item);
  29. }
  30. }
  31. if(email!=null){
  32. for(intj=0;j<email.size();j++){
  33. String[]item=email.get(j);
  34. insertItemToContact(ops,Email.CONTENT_ITEM_TYPE,rawId,
  35. PROJECTION_EAMIL_CONTACT,item);
  36. }
  37. }
  38. if(im!=null){
  39. for(intj=0;j<im.size();j++){
  40. String[]item=im.get(j);
  41. insertItemToContact(ops,Im.CONTENT_ITEM_TYPE,rawId,
  42. PROJECTION_IM_CONTACT,item);
  43. }
  44. }
  45. if(address!=null){
  46. for(intj=0;j<address.size();j++){
  47. String[]item=address.get(j);
  48. insertItemToContact(ops,StructuredPostal.CONTENT_ITEM_TYPE,
  49. rawId,PROJECTION_ADDRESS_CONTACT,item);
  50. }
  51. }
  52. if(organization!=null){
  53. for(intj=0;j<organization.size();j++){
  54. String[]item=organization.get(j);
  55. insertItemToContact(ops,Organization.CONTENT_ITEM_TYPE,rawId,
  56. PROJECTION_ORGANIZATION_CONTACT,item);
  57. }
  58. }
  59. if(notes!=null){
  60. for(intj=0;j<notes.size();j++){
  61. String[]item=notes.get(j);
  62. insertItemToContact(ops,Note.CONTENT_ITEM_TYPE,rawId,
  63. PROJECTION_NOTES_CONTACT,item);
  64. }
  65. }
  66. if(nickname!=null){
  67. for(intj=0;j<nickname.size();j++){
  68. String[]item=nickname.get(j);
  69. insertItemToContact(ops,Nickname.CONTENT_ITEM_TYPE,rawId,
  70. PROJECTION_NICKNAMES_CONTACT,item);
  71. }
  72. }
  73. if(website!=null){
  74. for(intj=0;j<website.size();j++){
  75. String[]item=website.get(j);
  76. insertItemToContact(ops,Website.CONTENT_ITEM_TYPE,rawId,
  77. PROJECTION_WEBSITES_CONTACT,item);
  78. }
  79. }
  80. cr.applyBatch(ContactsContract.AUTHORITY,ops);
  81. returnrawId;
  82. }
  83. /*
  84. *通过往ROWCONTACT里插入数据,获得rawId
  85. *
  86. *@paramcr
  87. *
  88. *@paramaccountName一般为NULL
  89. *
  90. *@paramaccountType一般为NULL
  91. *
  92. *@return
  93. */
  94. privatestaticlonginsertRawContact(ContentResolvercr,
  95. StringaccountName,StringaccountType){
  96. ContentValuesvalues=newContentValues();
  97. values.put(RawContacts.ACCOUNT_NAME,accountName);
  98. values.put(RawContacts.ACCOUNT_TYPE,accountType);
  99. //values.put(Contacts.DISPLAY_NAME,displayName);
  100. UrirawContactUri=cr.insert(RawContacts.CONTENT_URI,values);
  101. longrawContactId=ContentUris.parseId(rawContactUri);
  102. returnrawContactId;
  103. }
  104. privatestaticvoidinsertContactDisplayname(
  105. ArrayList<ContentProviderOperation>ops,StringmimeType,
  106. StringrawContactId,StringdisplayName)throwsRemoteException,
  107. OperationApplicationException{
  108. ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI).withValue(
  109. Data.MIMETYPE,mimeType).withValue(Data.RAW_CONTACT_ID,
  110. rawContactId).withValue(StructuredName.DISPLAY_NAME,
  111. displayName).build());
  112. }
  113. privatestaticvoidinsertItemToContact(
  114. ArrayList<ContentProviderOperation>ops,StringmimeType,
  115. StringrawContactId,String[]PROJECTION_CONTACT,String[]item)
  116. throwsRemoteException,OperationApplicationException{
  117. //ContentValuesvalues=newContentValues();
  118. //values.put(Data.RAW_CONTACT_ID,rawContactId);
  119. //values.put(Data.MIMETYPE,mimeType);
  120. //for(inti=0;i<PROJECTION_CONTACT.length;i++){
  121. //values.put(PROJECTION_CONTACT[i],item[i]);
  122. //}
  123. //UridataUri=cr.insert(Data.CONTENT_URI,values);
  124. Builderbuilder=ContentProviderOperation.newInsert(Data.CONTENT_URI);
  125. builder.withYieldAllowed(true);
  126. builder.withValue(Data.RAW_CONTACT_ID,rawContactId);
  127. builder.withValue(Data.MIMETYPE,mimeType);
  128. for(inti=0;i<PROJECTION_CONTACT.length;i++){
  129. builder.withValue(PROJECTION_CONTACT[i],item[i]);
  130. }
  131. ops.add(builder.build());
  132. }

更多相关文章

  1. android 获取手机通讯录联系人,模拟通讯录显示
  2. android 2.0读取联系人
  3. Android -联系人列表
  4. 通过代码设置Android联系人的头像
  5. android sqlite3 数据库升级,加字段
  6. android联系人源码解析
  7. Android查询所有联系人和根据号码查询联系人方法
  8. Android跳转系统联系人界面插入联系人 传真\地址\邮箱\职位\
  9. Android 判断所有字段是否已经输入的实例

随机推荐

  1. AndroidStudio快捷键整理--3
  2. Android的Activity滑动切换动画
  3. Android(安卓)GridView等控件的属性集合
  4. 好用的Android的UI第三方开源框架
  5. Android(安卓)开发笔记 动画效果 --Anima
  6. Android海康监控视频调用demo
  7. Android中TabHost的原理及使用
  8. Android(安卓)记录一次开发微信分享功能
  9. Android面试时的问题,实现半透明的popupw
  10. Android(安卓)给Button加个监听