Получить номер контактного телефона из URI в Android - PullRequest
9 голосов
/ 30 июля 2010

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

Может ли кто-нибудь указать мне лучшее направление или показать пример того, как получить номер телефона контакта ПОСЛЕ получения идентификатора пользователя?

Мой код:

    private Runnable getSMSRunnable() {
    return new Runnable() {
    public void run() {
    Intent i = new Intent(Intent.ACTION_PICK,
      ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
    startActivityForResult(i, CONTACTS_REQUEST_CODE);
   }
  };
 }

Возвращает вывод журнала

content://com.android.contacts/data/6802

Из которого я передаю идентификатор (6802) в метод, предназначенный для возврата номера телефона из идентификатора с указанным типом (в данном случае ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)

public static String getContactPhoneNumberByPhoneType(Context context, long contactId, int type) {
    String phoneNumber = null;

    String[] whereArgs = new String[] { String.valueOf(contactId), String.valueOf(type) };

    Log.d(TAG, String.valueOf(contactId));

    Cursor cursor = context.getContentResolver().query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            null,
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? and "
                    + ContactsContract.CommonDataKinds.Phone.TYPE + " = ?", whereArgs, null);

    int phoneNumberIndex = cursor
            .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER);

    Log.d(TAG, String.valueOf(cursor.getCount()));

    if (cursor != null) {
        Log.v(TAG, "Cursor Not null");
        try {
            if (cursor.moveToNext()) {
                Log.v(TAG, "Moved to first");
                Log.v(TAG, "Cursor Moved to first and checking");
                phoneNumber = cursor.getString(phoneNumberIndex);
            }
        } finally {
            Log.v(TAG, "In finally");
            cursor.close();
        }
    }

    Log.v(TAG, "Returning phone number");
    return phoneNumber;
}

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

Любая помощь будет принята с благодарностью. Большое вам спасибо!

Ответы [ 2 ]

12 голосов
/ 31 июля 2010

Я нашел ответ.

Причина, по которой я не получал строки от курсора, заключалась в том, что я использовал строку

ContactsContract.CommonDataKinds.Phone.CONTACT_ID

"Идентификатор строки в таблице контактов, которой принадлежат эти данные."

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

ContactsContract.CommonDataKinds.Phone._ID

Обмен строк вернул правильные результаты в запросе. Кажется, в данный момент все работает хорошо.

2 голосов
/ 30 июля 2010

Это должно работать, (возможно, попытаться потерять тип)

Номера телефонов хранятся в отдельной таблице и должны запрашиваться отдельно.Для запроса таблицы телефонных номеров используйте URI, хранящийся в переменной SDK ContactsContract.CommonDataKinds.Phone.CONTENT_URI.Используйте условие WHERE, чтобы получить номера телефонов для указанного контакта.

        if (Integer.parseInt(cur.getString(
               cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
            Cursor pCur = cr.query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
        null, 
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
        new String[]{id}, null);
        while (pCur.moveToNext()) {
        // Do something with phones
        } 
        pCur.close();
    }

Выполните второй запрос к базе данных SQLite контактов Android.Телефонные номера сопоставляются с URI, хранящимся в ContactsContract.CommonDataKinds.Phone.CONTENT_URI.Идентификатор контакта хранится в таблице телефона как ContactsContract.CommonDataKinds.Phone.CONTACT_ID, а предложение WHERE используется для ограничения возвращаемых данных.

...