Получение идентификатора контакта из базы контактов Android не работает должным образом - PullRequest
4 голосов
/ 09 сентября 2011

У меня есть следующий код.

        int phoneContactID = new Random().nextInt();

    Cursor contactLookupCursor =  context.getContentResolver().query( Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,Uri.encode(contactNumber)), new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup._ID},null,null,null);     

    try 
    {
        contactLookupCursor.moveToFirst();
        while(contactLookupCursor.moveToNext())
        {
            phoneContactID = contactLookupCursor.getInt(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup._ID));
         }
    } 
    finally 
    {
        contactLookupCursor.close();
    }       

Проблема в приведенном выше коде состоит в том, что даже если я даю существующее число в контактах эмулятора, оно не возвращает никаких результатов. Я тестировал его час назад, и он работал нормально, и теперь, когда я тестировал его снова, он ничего не возвращал. Я не уверен, если что-то не так с кодом. То, что я пытаюсь сделать, это получить идентификатор, который соответствует одному с несколькими номерами. Например, скажем, есть имя контакта под названием «А» и А имеет два числа. По сути, идентификатор контакта для A должен быть 1 независимо от того, на какой номер я ссылаюсь. Правильно ли мое предположение?

ОБНОВЛЕНИЕ: я сделал еще несколько тестов. Скажем, если номер хранится без кода страны в базе данных контактов, как 222-222-2222. Поиск с использованием приведенного ниже кода возвращает идентификатор контакта только тогда, когда я передаю 2222222222 или 222-222-2222. И если тот же номер хранится как 12222222222, действительный идентификатор контакта получен, только если я ищу номер 12222222222.

        String[] projection = new String[] {ContactsContract.CommonDataKinds.Phone._ID,ContactsContract.CommonDataKinds.Phone.CONTACT_ID};
    Uri contactUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(contactNumber));
    Cursor c = context.getContentResolver().query(contactUri, projection, null, null, null);
    if (c.moveToFirst()) {
        phoneContactID = c.getInt(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
    }

Я не уверен, что делаю что-то не так здесь. Любая помощь будет оценена.

Ответы [ 4 ]

19 голосов
/ 11 сентября 2011
public static int getContactIDFromNumber(String contactNumber,Context context)
{
    contactNumber = Uri.encode(contactNumber);
    int phoneContactID = new Random().nextInt();
    Cursor contactLookupCursor = context.getContentResolver().query(Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,contactNumber),new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup._ID}, null, null, null);
        while(contactLookupCursor.moveToNext()){
            phoneContactID = contactLookupCursor.getInt(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup._ID));
            }
        contactLookupCursor.close();

    return phoneContactID;
}

Код, который сейчас работает.

3 голосов
/ 09 сентября 2011

Окей. Извините, я скучаю, истолковал ваш вопрос Я не сделал этого. Но я думаю, что следующий код может работать Попробуйте и позвольте мне знать:

Cursor phone_cursor = cr.query( 
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                        null,
                        ContactsContract.CommonDataKinds.Phone.NUMBER + " = ?", 
                        new String[]{"YOUR NUMBER GOES HERE"}, null); 
                while (phone_cursor.moveToNext()) 
                { 

//here you can extract the inofrmation you want


phone_cursor.getString(             phone_cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                }
1 голос
/ 09 сентября 2011

Выполните шаги следующим образом:

// Этот метод вернет курсор, который будет содержать всю информацию

private Cursor getContacts()
    {
        // Run query
        Uri uri = ContactsContract.Contacts.CONTENT_URI;
        String[] projection = new String[] {
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME,      
        };

        String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER;
        String[] selectionArgs = null;
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

        return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
    }

Далее вы можете пройти по этому курсору, чтобы получить имяи ID как следует:

while (cursor.moveToNext()) 
            {
                namess[i]= cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                id[i] = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                i++;
            }
0 голосов
/ 23 января 2016

vikramjb ответ отличный, я попытался сделать это более понятным способом (используя инструкции здесь https://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup.html):

private Long GetContactIdFromNumber(ContentResolver contentResolver, String number)
{
    Uri contactLookup = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
    Cursor contactLookupCursor = contentResolver.query(contactLookup,new String[] {ContactsContract.PhoneLookup._ID}, null, null, null);
    if (contactLookupCursor.moveToNext()){
        long ret = contactLookupCursor.getLong(contactLookupCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID));
        contactLookupCursor.close();
        return ret;
    }
    contactLookupCursor.close();
    return 0l;
}

Кстати, в версиях API (выше 21) есть столбец PHONE_ACCOUNT_ID в CallLog.Calls: https://developer.android.com/reference/android/provider/CallLog.Calls.html

...