Reputation: 544
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
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
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