Get Contacts mobile number only

John J Smith picture John J Smith · Aug 18, 2011 · Viewed 11.1k times · Source

There have been several questions on SO regarding getting Contacts numbers using the Contacts API but I'd like to know if there is a way to identify that the number retrieved is a mobile number.

The following code is often shown as a way to get a Contact's phone numbers, as it gets a list of one or more phone numbers:

String[] projection = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER};
    String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1";

    Cursor cursor = null;
    Cursor phones = null;
    try
    {
        cursor =  managedQuery(intent.getData(), projection, selection, null, null);
        while (cursor.moveToNext()) 
        {           
            String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));

            phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null);
            while (phones.moveToNext()) 
            {               
                String pdata = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
                Log.v("DATA",pdata);
            }                           
       }  
    }
    catch (NullPointerException npe)
    {
        Log.e(TAG, "Error trying to get Contacts.");
    }
    finally
    {
        if (phones != null)
        {
            phones.close();
        }
        if (cursor != null)
        {
            cursor.close();
        }           
    } 

Whilst, this works okay, is there any way to easily identify that the phone number is a mobile type (apart from trying to pattern match with Regex).

I suspect there must be a related piece of data, so that native apps can classify the phone number - as in the picture below:

Phone types in Contact info

Answer

John J Smith picture John J Smith · Dec 29, 2011

I stumbled upon a blog article which gives a pretty good explanation of using the ContactsContract api here.

So, in my example above, I changed part of my code above to this:

while (phones.moveToNext()) 
{                   
     int phoneType = phones.getInt(phones.getColumnIndex(Phone.TYPE));
     if (phoneType == Phone.TYPE_MOBILE)
     {
          phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
          phoneNumber = phoneNumber.replaceAll("\\s", "");
          break;
     }
}

This loops around all the phones for an individual contact and if the type is Phone.TYPE_MOBILE then it takes this one.

Hope this helps someone with the same issue I had.