Получить номер мобильного телефона только для контактов - PullRequest
10 голосов
/ 19 августа 2011

У SO было несколько вопросов относительно получения номеров Контактов с помощью 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

Ответы [ 2 ]

25 голосов
/ 29 декабря 2011

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

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

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, то он принимает этот.

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

1 голос
/ 17 октября 2014

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

...