1

すべての連絡先の基本情報を取得したい(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モデル、または名前、電話番号、電子メール、写真を同時に取得してカーソルアダプターに渡す照会に設定するためのより良い方法。

前もって感謝します

4

2 に答える 2

2

連絡先アプリからContactsPhotoLoaderに変更して使用すると、パフォーマンスが向上ますCusorAdapter

于 2012-06-29T10:27:38.273 に答える
0

連絡先情報を取得するには、AndroidContactAPIを使用する必要があります。また、API 4(1.6)より前のAndroidAPIとAndroidAPI 5(2.0)以降では、このApiを異なる方法で処理する必要があることを最小限に抑える必要があります。

私はあなたを助けるいくつかの良いリンクをあなたに提供します:

  1. Androidの連絡先の操作
  2. 連絡先の写真の処理(すべてのAPIレベル)
  3. Contact PickerAPI2.0以降の使用
  4. 連絡先情報(名前、番号、プロフィール写真)API4以下の取得

    また、あなたに似たSOスレッドもあります。

Androidの連絡先ピッカーから連絡先情報を取得する

連絡先から写真を取得する

于 2012-05-30T08:48:28.347 に答える