Получить только номер мобильного телефона

Было задано несколько вопросов относительно получения номеров контактов с помощью API контактов, но я хотел бы знать, есть ли способ идентифицировать, что номер, полученный, является мобильным номером.

Следующий код часто отображается как способ получить номера контактных телефонов, так как он получает список из одного или нескольких телефонных номеров:

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();
        }           
    } 

В то время как это работает нормально, есть ли способ легко определить, что номер телефона является мобильным типом (кроме попытки сопоставления шаблонов с Regex).

Я подозреваю, что должен быть связанный фрагмент данных, так что родные приложения могут классифицировать номер телефона - как на рисунке ниже:

Phone types in Contact info

Ответ 1

Я наткнулся на статью в блоге, которая дает довольно хорошее объяснение использования ContactsContract api здесь.

Итак, в моем примере выше, я изменил часть моего кода выше на это:

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;
     }
}

Это позволяет обойти все телефоны для отдельного контакта, и если тип - Phone.TYPE_MOBILE, то он принимает этот.

Надеюсь, это поможет кому-то с той же проблемой, что и я.

Ответ 2

Исходный курсор запроса = managedQuery (intent.getData(), проекция, выбор, null, null); должен иметь возможность обрабатывать фильтр для вас. Я пытаюсь сделать то же самое. Я отправлю свои результаты, когда закончится. Если кто-то знает, как это сделать, используя предложение выбора в третьем параметре. Я хотел бы узнать ответ.