2017-11-23 21 views
0

私は3つのフラグメント(callLog、contactList、favoriteContactList)を持つ連絡先アプリを開発しています。片方を別の断片に移動すると、すべての連絡先を取得するのに時間がかかります。私は私のデバイス上で約276の連絡先を持っています。これを解決する任意の解決策は、時間を短縮します。連絡先リストを取得する最善の方法

ContentResolver cr = getContext().getContentResolver(); 
     String[] projection = {ContactsContract.Contacts._ID, 
       ContactsContract.Contacts.DISPLAY_NAME, 
       ContactsContract.Contacts.PHOTO_URI, 
       ContactsContract.Contacts.HAS_PHONE_NUMBER}; 

     Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, projection, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); 
     String id, name, image_uri, phone = ""; 

     if (cur != null && cur.getCount() > 0) { 
      while (cur.moveToNext()) { 

       id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
       name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
       image_uri = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI)); 

       Log.d(TAG, " name " + name + " id " + id); 

       // phone number 
       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); 
        if (pCur != null && pCur.moveToNext()) { 

         phone = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         int colIndex = pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE); 
         int lblIndex = pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.LABEL); 
         int labelType = pCur.getInt(colIndex); 
         String phoneType; 

         if (labelType == ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM) { 
          phoneType = pCur.getString(colIndex); 
         } else { 
          phoneType = String.valueOf(ContactsContract.CommonDataKinds.Phone.getTypeLabel(this.getResources(), labelType, "Mobile")); 
         } 

         Log.d(TAG, phoneType + " " + phone); 
         pCur.close(); 
        } 
        mContactArrayList.add(new Contact(id, name, phone, image_uri)); 
       } 
      } 
      cur.close(); 
     } 
+0

別のスレッド(AsyncTask)でこのメソッドを呼び出します。 – ADM

答えて

2

私はそれがうまくいくと思うこの1つのコード

Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); 
    while (phones.moveToNext()) { 
     String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
     String phone = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
     String id = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)); 
     String image_uri = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI)); 

     mContactArrayList.add(new Contact(id, name, phone, image_uri)); 

    } 

を試してみてください。

+0

動作しますが、カーソルが重複値を返すことがあります。 –

+0

はい、連絡先データベースからすべての連絡先を取得するためです。だから – SSALPHAX

+0

これは*連絡先ごとではなく、DBの*電話番号*ごとに1つの項目を返します。 mContactArrayListをHashMapに変更し、同じ連絡先の複数の電話番号を同じ連絡先オブジェクトに追加する必要があります。この回答を参照してください:https://stackoverflow.com/a/46594049/819355 – marmor

関連する問題