Android利用ContentProviderOperation添加联系人

Android添加联系人有两种方式:

1. 直接调用插入语句,先插入一个空Item,得到一个id,然后给这个id对应的插入其他信息,如姓名,号码,邮件等;

2. 利用ContentProviderOperation, 在系统应用Phonebook中就是采用这种方式, 代码如下:

实现了插入姓名,号码以及头像。

  1     private boolean saveUpdatedPhoto(long rawContactId, File photoFile) {

  2         final Uri outputUri = Uri.withAppendedPath(ContentUris.withAppendedId(

  3                 RawContacts.CONTENT_URI, rawContactId),

  4                 RawContacts.DisplayPhoto.CONTENT_DIRECTORY);

  5         boolean result = false;

  6         try {

  7             final FileOutputStream outputStream = getContentResolver()

  8                     .openAssetFileDescriptor(outputUri, "rw")

  9                     .createOutputStream();

 10             try {

 11                 final FileInputStream inputStream = new FileInputStream(

 12                         photoFile);

 13                 try {

 14                     final byte[] buffer = new byte[16 * 1024];

 15                     int length;

 16                     int totalLength = 0;

 17                     while ((length = inputStream.read(buffer)) > 0) {

 18                         outputStream.write(buffer, 0, length);

 19                         totalLength += length;

 20                     }

 21                     result = true;

 22                 } finally {

 23                     inputStream.close();

 24                 }

 25             } finally {

 26                 outputStream.close();

 27                 photoFile.delete();

 28             }

 29         } catch (IOException e) {

 30             result = false;

 31         }

 32         return result;

 33     }

 34 

 35     public void addContact(String name, CharSequence phoneNumber1,

 36             CharSequence phoneNumber2, String email1, String email2, String im,

 37             String nickname) {

 38         final ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();

 39         ContentProviderOperation.Builder builder = null;

 40         int rawContactIndex = 0;

 41 

 42         builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI);

 43         builder.withValue(RawContacts.ACCOUNT_NAME, "Phone contacts");

 44         builder.withValue(RawContacts.ACCOUNT_TYPE,

 45                 "com.sonyericsson.localcontacts");

 46         builder.withValue(RawContacts.AGGREGATION_MODE,

 47                 RawContacts.AGGREGATION_MODE_DISABLED);

 48         operationList.add(builder.build());

 49 

 50         // Add name.

 51         builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);

 52         builder.withValueBackReference(StructuredName.RAW_CONTACT_ID,

 53                 rawContactIndex);

 54         builder.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);

 55         builder.withValue(StructuredName.GIVEN_NAME, name);

 56         operationList.add(builder.build());

 57 

 58         // Add phone number.

 59         if (!TextUtils.isEmpty(phoneNumber1)) {

 60             builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);

 61             builder.withValueBackReference(Phone.RAW_CONTACT_ID,

 62                     rawContactIndex);

 63             builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);

 64             builder.withValue(Phone.TYPE, Phone.TYPE_MOBILE);

 65             builder.withValue(Phone.NUMBER, phoneNumber1);

 66             builder.withValue(Data.IS_PRIMARY, 1);

 67             operationList.add(builder.build());

 68         }

 69 

 70         // Add phone number.

 71         if (!TextUtils.isEmpty(phoneNumber2)) {

 72             builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);

 73             builder.withValueBackReference(Phone.RAW_CONTACT_ID,

 74                     rawContactIndex);

 75             builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);

 76             builder.withValue(Phone.TYPE, Phone.TYPE_HOME);

 77             builder.withValue(Phone.NUMBER, phoneNumber2);

 78             builder.withValue(Data.IS_PRIMARY, 0);

 79             operationList.add(builder.build());

 80         }

 81 

 82         // Add Email info.

 83         if (!TextUtils.isEmpty(email1)) {

 84             builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);

 85             builder.withValueBackReference(Email.RAW_CONTACT_ID,

 86                     rawContactIndex);

 87             builder.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);

 88             builder.withValue(Email.TYPE, Email.TYPE_MOBILE);

 89             builder.withValue(Email.DATA, email1);

 90             operationList.add(builder.build());

 91         }

 92 

 93         if (!TextUtils.isEmpty(email2)) {

 94             builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);

 95             builder.withValueBackReference(Email.RAW_CONTACT_ID,

 96                     rawContactIndex);

 97             builder.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);

 98             builder.withValue(Email.TYPE, Email.TYPE_HOME);

 99             builder.withValue(Email.DATA, email2);

100             operationList.add(builder.build());

101         }

102 

103         // Add IM info.

104         builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);

105         builder.withValueBackReference(Im.RAW_CONTACT_ID, rawContactIndex);

106         builder.withValue(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);

107         builder.withValue(Im.TYPE, Im.PROTOCOL_QQ);

108         builder.withValue(Im.DATA, im);

109         operationList.add(builder.build());

110 

111         // Add Nickname info.

112         builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);

113         builder.withValueBackReference(Nickname.RAW_CONTACT_ID, rawContactIndex);

114         builder.withValue(Data.MIMETYPE, Nickname.CONTENT_ITEM_TYPE);

115         builder.withValue(Nickname.TYPE, Nickname.TYPE_INITIALS);

116         builder.withValue(Nickname.DATA, nickname);

117         operationList.add(builder.build());

118 

119         try {

120             getContentResolver().applyBatch(ContactsContract.AUTHORITY,

121                     operationList);

122             // Get raw_contact_id

123             Cursor cc = getContentResolver().query(RawContacts.CONTENT_URI,

124                     null, "display_name=?", new String[] { name }, null);

125             cc.moveToFirst();

126             // Insert photo for the contact.

127             saveUpdatedPhoto(cc.getLong(cc.getColumnIndex("_id")), new File(

128                     "/sdcard/DCIM/Camera/ContactPhoto-IMG_19700104_013154.jpg"));

129         } catch (RemoteException e) {

130         } catch (OperationApplicationException e) {

131         }

132     }

基本思路是先插入除头像以外的其他信息,然后获得raw_contact_id,再给这个id插入头像,具体方法是saveUpdatedPhoto()。

Note:本人不太清楚能不能像插入姓名一样插入头像,所以才想出了这么一招,如果谁有更好的方法,不需要查询获得id就可以直接插入头像,共享一哈。

你可能感兴趣的:(ContentProvider)