すべての連絡先の基本情報を取得したい(APIレベル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;
}
カスタムアダプタ(拡張baseadapter)に渡します。連絡先の写真は次を使用して取得します。
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秒かかりました。アプリケーション設定で強制終了してから、もう一度実行してみます。今回はデータを取得するのに約2秒かかりました。連絡先情報を取得する最も効果的な方法を知りたいです。
似たようなSOの質問をいくつか見つけましたが、写真は必要ありません。androidの連絡先 カーソルとカーソルアダプターを使用してみましたが、photo_uri+連絡先名を同時に取得するためのクエリがわかりません。
編集:ループから外れて必要な列のみを投影できるすべてのgetColumnIndexを削除しました。パフォーマンスが向上します(10秒=> 5秒)。
私が知りたいこと:情報を照会し、ContactInfoモデル、または名前、電話番号、電子メール、写真を同時に取得してカーソルアダプターに渡す照会に設定するためのより良い方法。
前もって感謝します