Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problems with ContactsContract.CommonDataKinds.StructuredName

I got most of the things working when querying contact data. I'm fighting with StructuredName and Organization. They do not work for me.

If you don't mind please have a look at the code. It's handcrafted and lot of error checking is removed to make it as small as possible to be posted here. Comments with "not working" are the parts that don't work for me.

The two leading if() are part of the onActivityResult where I receive the data at the end of the contact selection. Calling is done with:

intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, Main.DIALOG_PICKCONTACT);

Many thanks in advance HJW

if (requestCode == Main.DIALOG_PICKCONTACT) {
 if (resultCode == RESULT_OK) {
  int i;
  String s;
  Cursor cursorContacts = managedQuery(intent.getData(),
      null,
      null,
      null,
      null);
  if (cursorContacts != null) {
   if (cursorContacts.moveToNext()) {
    ContentResolver contentResolver = getContentResolver();
    String contactId = cursorContacts.getString(cursorContacts.getColumnIndex(ContactsContract.Contacts._ID));
    i = cursorContacts.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
    // cursorContacts.getString(i); *** is DISPLAY_NAME
    Cursor cursorEmail = contentResolver.query(
        ContactsContract.CommonDataKinds.Email.CONTENT_URI,
        null,
        ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
        new String[] { contactId },
        null);
    if (cursorEmail != null) {
     while (cursorEmail.moveToNext()) {
      int type = cursorEmail.getInt(cursorEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
      s = cursorEmail.getString(cursorEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
      switch (type) {
       case ContactsContract.CommonDataKinds.Email.TYPE_HOME:
        // s *** is private Email
        break;
       case ContactsContract.CommonDataKinds.Email.TYPE_WORK:
        // s *** is business Email
        break;
      }
     }
     cursorEmail.close();
    }
    Cursor cursorOrganization = contentResolver.query(
        ContactsContract.Data.CONTENT_URI,
        null,
        ContactsContract.CommonDataKinds.Organization.CONTACT_ID + " = ?",
        new String[] { contactId },
        null);
    if (cursorOrganization != null) {
     if (cursorOrganization.moveToNext()) {
      s = cursorOrganization.getString(cursorOrganization.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA));
      // s *** Company name not working
      s = cursorOrganization.getString(cursorOrganization.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE));
      // s *** Function within company not working
     }
     cursorOrganization.close();
    }
    s = cursorContacts.getString(cursorContacts.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
    if (Integer.parseInt(s) > 0) {
     Cursor cursorPhone = contentResolver.query(
         ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
         null,
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
         new String[] { contactId },
         null);
     if (cursorPhone != null) {
      while (cursorPhone.moveToNext()) {
       int type = cursorPhone.getInt(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
       s = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
       switch (type) {
        case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME:
         // s *** is private fax
         break;
        case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK:
         // s *** is business fax
         break;
        case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
         // s *** is private phone
         break;
        case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
         // s *** is mobile phone
         break;
        case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
         // s *** is business phone
         break;
        case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE:
         // s *** is business mobile
         break;
       }
      }
      cursorPhone.close();
     }
    }
    Cursor cursorStructuredName = contentResolver.query(
        ContactsContract.Data.CONTENT_URI,
        null,
        ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID + " = ?",
        new String[] { contactId },
        null);
    if (cursorStructuredName != null) {
     if (cursorStructuredName.moveToNext()) {
      i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
      // cursorStructuredName.getString(i); *** given name not working
      i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME);
      // cursorStructuredName.getString(i); *** middle name not working
      i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.PREFIX);
      // cursorStructuredName.getString(i); *** prefix not working
      i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.SUFFIX);
      // cursorStructuredName.getString(i); *** suffix not working
     }
     cursorStructuredName.close();
    }
    Cursor cursorStructuredPostal = contentResolver.query(
        ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,
        null,
        ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + " = ?",
        new String[] { contactId },
        null);
    if (cursorStructuredPostal != null) {
     while (cursorStructuredPostal.moveToNext()) {
      int type = cursorStructuredPostal.getInt(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
      s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
      switch (type) {
       case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME:
        //s *** is private country
        break;
       case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK:
        // s *** is business country
        break;
      }
      s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
      switch (type) {
       case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME:
        // s *** is private city
        break;
       case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK:
        // s *** is business city
        break;
      }
      s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
      switch (type) {
       case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME:
        // s *** is private postcode
        break;
       case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK:
        // s *** is business postcode
        break;
      }
      s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
      switch (type) {
       case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME:
        // s *** is private street
        break;
       case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK:
        // s *** is business street
        break;
      }
     }
     cursorStructuredPostal.close();
    }
    Cursor cursorWebsite = contentResolver.query(
        ContactsContract.Data.CONTENT_URI,
        null,
        ContactsContract.CommonDataKinds.Website.CONTACT_ID + " = ?",
        new String[] { contactId },
        null);
    if (cursorWebsite != null) {
     while (cursorWebsite.moveToNext()) {
      i = cursorWebsite.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL);
      int type = cursorWebsite.getColumnIndex(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE);
      s = cursorWebsite.getString(i);
      switch (type) {
       case ContactsContract.CommonDataKinds.Website.TYPE_HOME:
        // s *** private url not working
        break;
       case ContactsContract.CommonDataKinds.Website.TYPE_WORK:
        // s *** business url not working
        break;
      }
     }
     cursorWebsite.close();
    }
   }
   cursorContacts.close();
  }
 }
}
like image 265
Harald Wilhelm Avatar asked Dec 06 '10 13:12

Harald Wilhelm


2 Answers

Your where condition is wrong.

Use this for StructuredName:

    // projection
    String[] projection = new String[] {ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME};


    String where = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
    String[] whereParameters = new String[]{this.contact_id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE};

    //Request
    Cursor contacts = this.resolver.query(ContactsContract.Data.CONTENT_URI, projection, where, whereParameters, null);

    //Iteration
    if (contacts.moveToFirst()) { 
        //code here
    } 
    contacts.close();
like image 109
MrKent Avatar answered Nov 07 '22 22:11

MrKent


Couldn't find complete solution how to get first, last, middle name and birthday of a person picked from contacts. So here is my solution:

Show a contacts' list:

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, GET_PHONE_ADDRESS_BOOK_CONST);

Pick up a contact:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode == Activity.RESULT_OK) { 
        switch (requestCode) {

        case GET_PHONE_ADDRESS_BOOK_CONST:
            getContactFromAddressBook(data);
            break;


        default:
            break;
        }
    } 
    super.onActivityResult(requestCode, resultCode, data);
}

Get contact's id:

private void getContactFromAddressBook(Intent data) {

    if (data != null) {
        Uri uri = data.getData();
        if (uri != null) {
            Cursor c = null;
            try {               
                c = getActivity().getContentResolver().query(uri,
                        null, null, null, null);

                if (c != null && c.moveToFirst()) {
                    String id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
                    getFullName(id);
                    getBirthday(id);
                }
            } 
            catch(Exception e) {
                Utils.Loge(e.getMessage(), e);
            }
            finally {
                if (c != null) {
                    c.close();
                }
            }
        }
    }
}

Get first, last and middle names

private HashMap<String, String> getFullName(String id)
{
    HashMap<String, String> ret = new HashMap<String, String>();

    String whereName = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
    String[] whereNameParams = new String[] { id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE };
    Cursor c = null;
    try {
        c = getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, whereName, whereNameParams, null);
        if (c != null && c.moveToFirst()) {
            int indexGivenName = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
            int indexFamilyName = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME);
            int indexDisplayName = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME);    

            ret.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, c.getString(indexGivenName));
            ret.put(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, c.getString(indexFamilyName));
            ret.put(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, c.getString(indexDisplayName));
        }
    } 
    catch(Exception e) {
        Utils.Loge(e.getMessage(), e);
    }
    finally {
        if (c != null) {
            c.close();
        }
    }
    return ret;
}

Get birthday

private Date getBirthday(String id)
{
    Date date = null;

    String whereName = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ? AND " + ContactsContract.CommonDataKinds.Event.TYPE + " = ?"; 
    String[] whereNameParams = new String[] { id, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE, String.valueOf(ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) };
    Cursor c = null;
    try {
        c = getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, whereName, whereNameParams, null);
        if (c != null && c.moveToFirst()) {
            int indexBirthday = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Event.START_DATE); 
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
            date = format.parse(c.getString(indexBirthday));
        }
    } 
    catch(Exception e) {
        Utils.Loge(e.getMessage(), e);
    }
    finally {
        if (c != null) {
            c.close();
        }
    }
    return date;
}
like image 34
blyabtroi Avatar answered Nov 07 '22 21:11

blyabtroi