2012-05-30 111 views
1

我想獲得所有聯繫人的一些基本信息(我使用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; 

} 

並傳遞給自定義適配器(擴展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); 
} 

我在我的手機上測試了2個聯繫人(有照片)。在第一次運行時,我花了大約10秒時間獲取所有聯繫人。我嘗試在應用程序設置中關閉並再次運行。這一次需要花費大約2秒才能獲得數據。因此,我想知道獲取聯繫人信息的最有效方法。

我發現了一些類似的問題,但他們不需要照片。 contacts in android 我試過使用光標和光標適配器,但我不知道什麼查詢同時獲取photo_uri +聯繫人姓名。

編輯:我刪除了所有getColumnIndex我可以超出循環和項目只列我想要的。性能更好(10s => 5s)。

我想知道的更多: 更好的方式來查詢信息並設置爲我的ContactInfo模型或查詢獲取名稱,電話號碼,電子郵件,照片的同時傳遞給遊標適配器。

在此先感謝

回答

2

我改CusorAdapter和使用來自通訊錄應用ContactsPhotoLoader和性能得到改善。

+1

嗨,感謝您的鏈接,你能提供一些你如何完全解決這個問題的示例嗎? –

0

要獲取聯繫信息,您必須使用Android聯繫人API。此外,你必須保持分鐘,你必須以不同的方式處理API API(API 1.6以下)和Android API 5(2.0)以及更高版本的API:

我會爲您提供一些很好的鏈接這將幫助你:

  1. Working With Android Contacts
  2. Handling Contact Photos (All API Levels)
  3. Using the Contact Picker API 2.0 and above
  4. Retrieving Contact Information (Name, Number, and Profile Picture) API4 and lower

    帖也有一些SO線程類似於你必須b有助於您

get contact info from android contact picker

Getting a Photo from a Contact

+0

我在訪問您的所有鏈接之前問這個問題:(。我想要的是如何更快地獲取信息 –

相關問題