Я хочу получить базовую информацию обо всех контактах (я использую api lvl 8). В настоящее время я использую этот фрагмент кода
private List<ContactInfo> readContacts() {
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, Phone.DISPLAY_NAME + " ASC");
for (int i = 0; i < cur.getColumnCount(); i++) {
Log.v("COlum", cur.getColumnName(i));
}
List<ContactInfo> temp = new ArrayList<ContactInfo>();
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
ContactInfo mContactInfo = new ContactInfo();
String id = cur.getString(cur
.getColumnIndex(ContactsContract.Contacts._ID));
mContactInfo.setId(Long.parseLong(id));
String name = cur
.getString(cur
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
if (Integer
.parseInt(cur.getString(cur
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
mContactInfo.setmDisplayName(name);
// get the <span class="IL_AD" id="IL_AD7">phone
// number</span>
Cursor pCur = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?", new String[] { id }, null);
while (pCur.moveToNext()) {
String phone = pCur
.getString(pCur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
mContactInfo.setmPhoneNumber(phone);
}
pCur.close();
// get email and type
Cursor emailCur = cr.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID
+ " = ?", new String[] { id }, null);
while (emailCur.moveToNext()) {
// This would allow you get several email <span
// class="IL_AD" id="IL_AD9">addresses</span>
// if the email addresses were stored in an array
String email = emailCur
.getString(emailCur
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
mContactInfo.setmEmail(email);
}
emailCur.close();
temp.add(mContactInfo);
}
}
}
return temp;
}
и перейти к пользовательскому адаптеру (расширенный базовый адаптер). Я получаю контактную фотографию, используя:
public static Bitmap loadContactPhoto(ContentResolver cr, long id) {
Uri uri = ContentUris.withAppendedId(
ContactsContract.Contacts.CONTENT_URI, id);
InputStream input = openContactPhotoInputStream1(cr, uri);
if (input == null) {
return null;
}
return BitmapFactory.decodeStream(input);
}
Я тестировал на своем телефоне с 2x контактами (имел фотографию). Я взял ~ 10 с, чтобы получить все контакты в 1-м режиме. Я пытаюсь закрыть настройки приложения и снова запустить. На этот раз потребовалось ~ 2 с для получения данных. Поэтому я хочу узнать наиболее эффективный способ получить информацию о контактах.
Я нашел несколько похожих вопросов, но им не нужна фотография. контакты в android Я пробовал использовать курсор и адаптер курсора, но я не знаю, какой запрос будет получать имя_каталога + имя контакта одновременно.
Изменить: я удалил все getColumnIndex, я могу выйти из цикла и только столбца проекта, который я хочу. Эффективность лучше (10s = > 5 с).
Что я хочу знать: Лучший способ запросить информацию и установить мою модель ContactInfo или запрос, который одновременно получает имя, номер телефона, адрес электронной почты, фотографию для перехода к адаптеру курсора.
Заранее спасибо
Я изменил на CusorAdapter
и использовал ContactsPhotoLoader из приложения "Контакты" и производительность улучшена.
Чтобы получить контактную информацию, вам нужно работать с API контактов Android. Также вам нужно держать в мин, что вам придется обрабатывать этот Api по-другому для android api ниже API 4 (1.6) и для Android API 5 (2.0) и выше:
Я расскажу вам о хороших ссылках, которые помогут вам:
Получение контактной информации (имя, номер и изображение профиля) API4 и ниже
В них также есть некоторая SO-нить, похожая на вашу, которая вам нужна b
получить контактную информацию с помощью панели контактов android