• 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就可以直接插入头像,共享一哈。

  • 相关阅读:
    event与WaitForSingleObject、MsgWaitForMultipleObjects等
    vc不包含MFC就不打印内存泄露?
    使用visual leak detector(vld)查找内存泄露
    C#里面中将字符串转为变量名
    如何编写nopCommerce插件
    object成员,不见了!
    NopCommerce 定制系列(一):增加 Sha256+Base64 加密
    c#中的二维数组与锯齿数组
    待搞清楚
    NopCommerce 2.5的部署
  • 原文地址:https://www.cnblogs.com/wlrhnh/p/3477216.html
Copyright © 2020-2023  润新知