2015-06-15 56 views
2

我正在開發一個短信應用程序並出現以下問題。目前我可以通過使用CursorLoader使用提供商Telephony.Sms.Conversations來閱讀短信會話。從這個CursorLoader返回的光標,我可以顯示對話的地址,這是電話號碼。加載短信對話以及聯繫人姓名

我的問題是如何有效地檢索短信會話聯繫人姓名以顯示短信會話,而不是電話號碼。無論如何加載CursorLoader之前返回的電話號碼列表中的聯繫人列表?當然,我嘗試使用電話號碼逐個加載聯繫人姓名,但這大大降低了應用程序的性能。

預先感謝您。

回答

1

我一直在尋找自己的解決方案,並最終在我看來出現了一個很好的妥協。

只要我的查詢結束後,我在一個HashMap<String, String> contact_map我的值存儲爲

int SENDER_ADDRESS = cursor.getColumnIndex(Telephony.TextBasedSmsColumns.ADDRESS); 

while (cursor.moveToNext()) { 
       contact_map.put(
         cursor.getString(SENDER_ADDRESS), 
         getContactName(getApplicationContext(), cursor.getString(SENDER_ADDRESS)) 
       ); 
      } 

方法getContactName:

public static String getContactName(Context context, String phoneNumber) { 
    ContentResolver cr = context.getContentResolver(); 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
    Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null); 
    if (cursor == null) { 
     return null; 
    } 
    String contactName = null; 
    if(cursor.moveToFirst()) { 
     contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 
    } 

    if(cursor != null && !cursor.isClosed()) { 
     cursor.close(); 
    } 

    if (contactName != null) { 
     return contactName; 
    } else { 
     return phoneNumber; 
    } 

} 

編輯: 我再拿到聯繫人姓名與

String name = contact_map.get(cursor.getString(SENDER_ADDRESS)); 

希望它有幫助!

相關問題