KCRaju
KCRaju

Reputation: 544

getting FATAL Exception while getting email address from device contacts

I am trying get Email addresses from device contacts by using following code but i am getting FATAL EXCEPTION. please help to resolve my issue.

07-01 23:15:34.984: E/AndroidRuntime(22688): FATAL EXCEPTION: main
07-01 23:15:34.984: E/AndroidRuntime(22688): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.contacts/contacts/lookup/2292i7f5b6c750a4e6301/4631 flg=0x1 (has extras) }} to activity {kc.RajusLabs.iamhere/kc.RajusLabs.iamhere.Email}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 5
07-01 23:15:34.984: E/AndroidRuntime(22688):    at android.app.ActivityThread.deliverResults(ActivityThread.java:2536)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:2578)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at android.app.ActivityThread.access$2000(ActivityThread.java:117)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:965)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at android.os.Looper.loop(Looper.java:130)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at android.app.ActivityThread.main(ActivityThread.java:3687)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at java.lang.reflect.Method.invokeNative(Native Method)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at java.lang.reflect.Method.invoke(Method.java:507)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at dalvik.system.NativeStart.main(Native Method)
07-01 23:15:34.984: E/AndroidRuntime(22688): Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 5
07-01 23:15:34.984: E/AndroidRuntime(22688):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at android.database.CursorWrapper.getString(CursorWrapper.java:135)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at kc.RajusLabs.iamhere.Email.onActivityResult(Email.java:115)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at android.app.Activity.dispatchActivityResult(Activity.java:3908)
07-01 23:15:34.984: E/AndroidRuntime(22688):    at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)
07-01 23:15:34.984: E/AndroidRuntime(22688):    ... 11 more

CODE::

   if (resultCode == Activity.RESULT_OK) {
          Uri contactData = data.getData();
          Cursor c = managedQuery(contactData, null, null, null, null);
          c.moveToFirst();
          String name = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
          String name1 = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER));
          String ContactID = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));

       if(Integer.parseInt(name1) == 1){
         Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,
                                                    ContactsContract.CommonDataKinds.Email.CONTACT_ID+ " = " + ContactID, null, null);
         String emailIdOfContact = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
         Toast.makeText(getApplicationContext(), "NAME:: "+name+"ContactID:: "+ContactID, Toast.LENGTH_LONG).show();
         textMessage.setText(name+ContactID);

          }
          }
            break;

and i am getting Exception at

emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

Upvotes: 0

Views: 113

Answers (2)

AAnkit
AAnkit

Reputation: 27549

change below line

c.moveToFirst(); 

with

if(!c.moveToFirst())
 return;

Here C is cursor, Do same with other cursors as well like "emails"

you are trying to fetch values from empty cursor.

Upvotes: 2

dymmeh
dymmeh

Reputation: 22306

You aren't calling moveToFirst() on the emails cursor

Add

emails.moveToFirst();

after

 Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null, ContactsContract.CommonDataKinds.Email.CONTACT_ID+ " = " + ContactID, null, null);

And you should always verify that you successfully moved to the first position as AAnkit has suggested in his answer. I've updated your code to include these checks along with fixing your original problem and verifying that your DATA column isn't null

if (resultCode == Activity.RESULT_OK) {
    Uri contactData = data.getData();
    Cursor c = managedQuery(contactData, null, null, null, null);
    if (!c.moveToFirst())
        return;
    String name = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
    String name1 = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER));
    String ContactID = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));

    if (Integer.parseInt(name1) == 1) {
        Cursor emails = getContentResolver().query(
                ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
                ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + ContactID, null, null);
        if (!emails.moveToFirst())
            return;
        int index = emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)
        if (!emails.isNull(index)) {
            String emailIdOfContact = emails.getString(index);
            Toast.makeText(getApplicationContext(), "NAME:: " + name + "ContactID:: " + ContactID,
                    Toast.LENGTH_LONG).show();
            textMessage.setText(name + ContactID);
        }

    }
}
break;

Upvotes: 1

Related Questions