Получение номера телефона с помощью ContactsContract в Android - функция не работает - PullRequest
4 голосов
/ 05 января 2012

Я написал следующую функцию для извлечения одного телефонного номера, который принадлежит контакту с идентификатором «contactID».

Функция, которая предназначена для получения телефонного номера:

private String getContactPhone(String contactID) {
    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    String[] projection = null;
    String where = ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?";
    String[] selectionArgs = new String[] { contactID };
    String sortOrder = null;
    Cursor result = managedQuery(uri, projection, where, selectionArgs, sortOrder);
    if (result.moveToFirst()) {
        String phone = result.getString(result.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        if (phone == null) {
            result.close();
            return null;
        }
        result.close();
        return phone;
    }
    result.close();
    return null;
}

Как называется эта функция:

ArrayList<Contact> resultContacts = new ArrayList<Contact>();
Cursor result = null;
Uri uri = ContactsContract.Data.CONTENT_URI;
String[] projection = new String[] {
        ContactsContract.Contacts._ID,
        ContactsContract.Contacts.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Event.CONTACT_ID,
        ContactsContract.CommonDataKinds.Event.START_DATE,
};
String where = ContactsContract.Data.MIMETYPE+" = ? AND "+ContactsContract.CommonDataKinds.Event.TYPE+" = "+ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY;
String[] selectionArgs = new String[] {ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE};
String sortOrder = null;
result = managedQuery(uri, projection, where, selectionArgs, sortOrder);
while (result.moveToNext()) {
    Long id = result.getLong(result.getColumnIndex(ContactsContract.Contacts._ID));
    String phone = getContactPhone(String.valueOf(id));
    ...
}
...

К сожалению, она не работает.Я получаю ноль, если я вызываю эту функцию со значением, которое я получил из "ContactsContract.Contacts._ID".Почему это так?Что не так?

Редактировать: Я использовал для сопоставления Contacts._ID с CommonDataKinds.Phone.CONTACT_ID - который не работал.Но теперь я сопоставляю Contacts.DISPLAY_NAME с CommonDataKinds.Phone.DISPLAY_NAME, и он работает внезапно - странно, не правда ли?Но я бы предпочел отобразить идентификаторы вместо отображаемых имен.Так что вопрос все еще актуален.Может ли это быть из-за разных идентификаторов в этих таблицах?Разве не для этого есть идентификаторы поиска?

Ответы [ 3 ]

11 голосов
/ 10 января 2012

Чтобы получить идентификатор контакта в первой части, вы должны использовать:

ContactsContract.Data.CONTACT_ID

вместо:

ContactsContract.Contacts._ID

Таким образом, проекция должна быть:

String[] projection = new String[] {
         ContactsContract.Data.CONTACT_ID,
         ContactsContract.CommonDataKinds.Event.CONTACT_ID,
         ContactsContract.CommonDataKinds.Event.START_DATE,
 };

И тогда, конечно, получите правильный ряд:

Long id = result.getLong(result.getColumnIndex(ContactsContract.Data.CONTACT_ID));
1 голос
/ 11 января 2012

Ваш код для getContactPhone () отлично работает на моем конце. Я проверил, запустив средство выбора контактов, выбрав контакт, а затем используя идентификатор, который был возвращен, и передал его в ваш метод.

Так что я подозреваю, что вы действительно передаете неверный идентификатор. Можете ли вы опубликовать полную трассировку стека для исключения нулевого указателя?

Да, ключи поиска доступны, потому что _ID не гарантируют, что они останутся прежними, так как синхронизация и агрегация контактов изменяют их.

1 голос
/ 07 января 2012

Вы получаете ноль, потому что вы установили свою проекцию на ноль.Проекция - это, в основном, список возвращаемых столбцов, например:

String[] projection = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER};

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

Cursor phones = mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null);    
while (phones.moveToNext()) 
{    
     phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
}

Надеюсь, это поможет.

...