Search This Blog

Support my cause by downloading

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

Android News and source code