Search This Blog

Monday, 23 December 2013

Android Contact Content Provider API : Adding a contact to android phone using ContentProviderOperation

I have gone through tough time while adding contact to contact book in android Contact ContentProvider using new ContentProviderOperation. After doing some work around i found solution and made one go utility function for all android developer. This function allow to add name, address, Note, Photo and Number to Contact Book .

Following Permission is required for adding and modifying Contact


   <uses-permission android:name="android.permission.READ_CONTACTS" />  
   <uses-permission android:name="android.permission.WRITE_CONTACTS" />  

Now this is Utility Function , just copy and paste it anywhere. It will return Contact_ID of newly added Contact


      public String addContact(Activity mAcitvity, String name, String address, String number, String mNote,Bitmap mPhoto) {  
           int contactID = -1;  
           ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();  
           int rawContactID = ops.size();  
           // Adding insert operation to operations list  
           // to insert a new raw contact in the table ContactsContract.RawContacts  
           ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)  
                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null).withValue(RawContacts.ACCOUNT_NAME, null).build());  
           // Adding insert operation to operations list  
           // to insert display name in the table ContactsContract.Data  
           ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)  
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)  
                .withValue(ContactsContract.Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE).withValue(StructuredName.DISPLAY_NAME, name).build());  
           // Adding insert operation to operations list  
           // to insert Mobile Number in the table ContactsContract.Data  
           ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)  
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)  
                .withValue(ContactsContract.Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE).withValue(Phone.NUMBER, number)  
                .withValue(Phone.TYPE, CommonDataKinds.Phone.TYPE_MOBILE).build());  
           // Adding insert operation to operations list  
           // to insert Mobile Number in the table ContactsContract.Data  
           ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)  
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)  
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)  
                .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, address).build());  
           // Adding insert operation to operations list  
           // to insert Mobile Number in the table ContactsContract.Data  
           ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)  
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)  
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)  
                .withValue(ContactsContract.CommonDataKinds.Note.NOTE, mNote).build());  
     ByteArrayOutputStream stream = new ByteArrayOutputStream();  
     mPhoto.compress(CompressFormat.JPEG, 100, stream);  
     byte[] bytes = stream.toByteArray();  
           // Adding insert operation to operations list  
           // to insert Mobile Number in the table ContactsContract.Data  
           ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)  
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)  
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)  
                .withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes).build());  
           try {  
                ContentResolver mResolver = mAcitvity.getContentResolver();  
                ContentProviderResult[] mlist = mResolver.applyBatch(ContactsContract.AUTHORITY, ops);  
                Uri myContactUri = mlist[0].uri;  
                int lastSlash = myContactUri.toString().lastIndexOf("/");  
                int length = myContactUri.toString().length();  
                contactID = Integer.parseInt((String) myContactUri.toString().subSequence(lastSlash + 1, length));  
           } catch (Exception e) {  
                e.printStackTrace();  
           }  
           return String.valueOf(contactID);  
      }  

Now See you can call this function from anywhere with respective values. Pass your own values and Bitmap


 addContact(this, "Sammer", "Delhi", "11-9090909", "Going to Meeting", BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));  

See the output of function, this function is tested so do not worry while using


Contact API

No comments:

Post a Comment

Feedback always help in improvement. If you have any query suggestion feel free to comment and Keep visiting my blog to encourage me to blogging

Android News and source code