Получить номер телефона для связи с URI в Android
Я пытаюсь получить номер телефона контакта после того, как я получил свой идентификационный номер из встроенного действия. Однако всякий раз, когда я запрашиваю базу данных с помощью курсора в моем коде ниже, я получаю нулевые строки, даже если есть номер мобильного телефона для выбранного контакта.
Может ли кто-нибудь указать мне в лучшем направлении или показать пример того, как получить номер телефона контакта ПОСЛЕ получения их идентификатора пользователя?
Мой код:
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; }
Который возвращает null для номера телефона, что означает, что он не может найти строку, к которой я пытаюсь обратиться, – что означает, что что-то не так с моим запросом – однако, если я проверяю контакт с номером мобильного телефона – как я могу получить запрос строки 0?
Любая помощь будет принята с благодарностью. Спасибо огромное!
Я нашел ответ.
Причина, по которой я не получал никаких строк из курсора, состоял в том, что я использовал строку
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
«Идентификатор строки в таблице« Контакты », к которой относятся эти данные».
Поскольку я получал URI из таблицы контактов в любом случае – это не было необходимо, и следующее должно было быть заменено. Идентификатором был тот, который соответствует контакту в телефонной таблице, а не сырым контактом.
ContactsContract.CommonDataKinds.Phone._ID
Обмен строк возвращал правильные результаты в запросе. На данный момент все работает хорошо.
Это должно работать (возможно, попытайтесь потерять тип)
Телефонные номера хранятся в их собственной таблице, и их необходимо запрашивать отдельно. Чтобы запросить таблицу телефонных номеров, используйте 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 используется для ограничения возвращаемых данных.