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

Tuesday, 17 December 2013

Handler vs Timer : fixed-period execution and fixed-rate execution android development

In Android Timer and Handler are both can be used for repetitive call. We can do same piece of task using either Timer or Handler (With runnable). First going to pros and cos of each we should look what documentation says about both. Its very important to avoid memory leak in android application

Timer Recurring tasks are scheduled with either a fixed period or a fixed rate:
  • With the default fixed-period execution, each successive run of a task is scheduled relative to the start time of the previous run, so two runs are never fired closer together in time than the specified period.
   • With fixed-rate execution, the start time of each successive run of a task is scheduled without regard for when the previous run took place. This may result in a series of bunched-up runs (one launched immediately after another) if delays prevent the timer from starting tasks on time.

Handler  

  • to schedule messages and runnables to be executed as some point in the future; and 
  • to enqueue an action to be performed on a different thread than your own.


Handler Implementation


  • How to create repetitive task using Handler

  Handler mHandler;
  public void useHandler() {
    mHandler = new Handler();
    mHandler.postDelayed(mRunnable, 1000);
  }

  private Runnable mRunnable = new Runnable() {

    @Override
    public void run() {
      Log.e("Handlers", "Calls");
      /** Do something **/
      mHandler.postDelayed(mRunnable, 1000);
    }
  };

  • How to remove pending execution from Handler

       mHandler.removeCallbacks(mRunnable);

  • How to schedule it again

      mHandler.postDelayed(mRunnable, 1000);


  • Where to perform Task

      Runnable works under UI thread so you can update UserInterface in Handler respective Runnable


Timer Implementation


  • How to create repetitive task using Timer

  public void useTimer() {
    Timer mTimer = new Timer();
    mTimer.cancel();
    mTimer.schedule(new TimerTask() {

      @Override
      public void run() {
        Log.e("Timer", "Calls");
      }
    }, 1000, 1000);
  }


  • How to remove pending execution from Timer

      mTimer.cancel(); will cancel all the schedule task.

  • How to schedule it again

        You can not reschedule Timer again. So you to create object of timer again if you are trying to reschedule its task.


Comparison Handler VS Timer


  • While rescheduling Handler is very easy, you can not reschedule Timer


  • In Handler you can attach to any Runnable but Timer schedule for only one TimerTask


  • TimerTask is purely background task so you can not update UserInterface, but that's not true for Handler's Runnables
Timer Cause Execption


  • Timer tends to leak more memory compare to Handler see the graph of object retains by timer and Handler. It will increase rapidly for Timer if you are creating and scheduling new task.

Handler Memory Graph

Timer Memory Graph
Which one to use Obviously i will recommend to use Handler with Runnable

Tuesday, 3 December 2013

Showing pin radial progress bar during download android

This example is originally develop by Google Developer Roman Nurik and Nik Butcher. I lead to it more customization and make it easy to implement in android project.This Radial pin progress can be seen at Google play store in many project. This look very beautiful and classy.So lets develop it. Google developer create one custom class PinProgressButton which allows you some customization like color, theme according to your application.




PinProgressButton.Java which has attribute to customize it

 <resources>  
   <declare-styleable name="PinProgressButton">  
     <attr name="pinned" format="boolean" />  
     <attr name="progress" format="integer" />  
     <attr name="max" format="integer" />  
     <attr name="circleColor" format="color" />  
     <attr name="progressColor" format="color" />  
   </declare-styleable>  
 </resources>  

Pinpoint Progress Bar


Android News and source code