Я хочу получить данные всех контактов, такие как «Номер телефона», «Отображаемое имя», «Отображать изображение» и «Идентификатор электронной почты». Для этого я использую метод ниже, и он работает нормально.Восстановить контакты быстрее из адресной книги в android
public void readContacts() {
Log.d("readcontacts", "::" + "true");
String phoneNumber = null;
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
// contactEntity = new ContactEntity();
final ContentValues values = new ContentValues();
String Contact_Id = cur.getString(cur
.getColumnIndex(ContactsContract.Contacts._ID));
values.put(KEY_ID, Integer.parseInt(Contact_Id));
int hasPhoneNumber = Integer
.parseInt(cur.getString(cur
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)));
/*
* contactEntity .setContactFirstName(cur.getString(cur
* .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
*/
if (Integer
.parseInt(cur.getString(cur
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
// System.out.println("name : " + name + ", ID : " + id);
// sb.append("\n Contact Name:" + name);
Cursor pCur = cr
.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?",
new String[] { Contact_Id }, null);
if (pCur.moveToFirst()) {
phoneNumber = pCur
.getString(pCur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
// sb.append("\n Phone number:" + phone);
// System.out.println("phone" + phone);
}
pCur.close();
Cursor emailCur = cr
.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID
+ " = ?",
new String[] { Contact_Id }, null);
if (emailCur.moveToFirst()) {
values.put(
KEY_CONTACTEMAIL,
(emailCur.getString(emailCur
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))));
// emailType = emailCur .getString(emailCur
// .getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
}
emailCur.close();
if (phoneNumber.length() >= 10) {
final Uri my_contact_Uri = Uri.withAppendedPath(
ContactsContract.Contacts.CONTENT_URI,
String.valueOf(Contact_Id));
InputStream photo_stream = ContactsContract.Contacts
.openContactPhotoInputStream(
getContentResolver(),
my_contact_Uri);
if (photo_stream != null) {
BufferedInputStream buf = new BufferedInputStream(
photo_stream);
Bitmap my_btmp = BitmapFactory
.decodeStream(buf);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
my_btmp.compress(Bitmap.CompressFormat.PNG,
100, bos);
byte[] bArray = bos.toByteArray();
values.put(KEY_CONTACTIMAGE, bArray);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// contactEntity.setBitmapContactImage(my_btmp);
values.put(
KEY_CONTACTNAME,
String.valueOf(cur.getString(cur
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))));
values.put(KEY_CONTACTNUMBER,
String.valueOf(phoneNumber));
databaseHelperAssets.open();
databaseHelperAssets.addcontact(values);
databaseHelperAssets.close();
}
}
// values.put(KEY_TIMESWAP,
// String.valueOf(taskEnitiy.getTimeswap()));
// int SDK_INT = android.os.Build.VERSION.SDK_INT;
/*
* if (SDK_INT >= 11) { contactEntity
* .setImgUri(cur.getString(cur
* .getColumnIndex(ContactsContract.
* CommonDataKinds.Phone.PHOTO_URI))); }
*/
// alContactEntities.add(contactEntity);
}
}
}
Но проблема заключается в том, что требуется около 45 секунд до 1 минуты, чтобы получить информацию о 400 контактах. Я не могу заставить своих пользователей ждать так долго каждый раз, когда требуется получить контакт. Так может ли кто-нибудь помочь мне сократить время поиска контакта? и Да, я использую для хранения моего контакта в базе данных, потому что я впервые читаю свои контакты только при запуске приложения. Поэтому я найду лучший способ получить его, чтобы исключить сохранение контактов в базе данных. Заранее спасибо !!
Нужно ли открывать и закрывать 'databaseHelperAssets' на каждой записи? –
На самом деле я не хочу использовать базу данных. Я хочу показать ее на лету. – Jigar
. Меняю работу базы данных. Открываем и закрываем за пределами цикла, но все равно это слишком долго для меня. – Jigar