2010-12-17 107 views
2

我正在開發一個擴展SMS應用程序。現在我可以從mmssms.db中讀取所有SMS消息。在SMS數據庫表中,字段'person'表示聯繫人表中的'_id'。當「人員」> = 1時,表示該消息是從聯繫人列表中的人員發送的。所以我可以從聯繫人表中'managedQuery'。但問題是,在我的手機中,測試程序有時甚至不能查詢聯繫人信息,即使'person'> = 1。那麼有人可以告訴我一些正確的方法來查詢SMS表中提交的'person'的聯繫信息嗎? 下面是一些示例代碼,它可以使我的問題更加清晰:如何通過短信獲取聯繫信息

class ContactItem { 
    public String mName; 
} 

    ContactItem getContact(Activity activity, final SMSItem sms) { 
     if(sms.mPerson == 0) return null; 
     Cursor cur = activity.managedQuery(ContactsContract.Contacts.CONTENT_URI, 
       new String[] {PhoneLookup.DISPLAY_NAME}, 
       " _id=?", 
       new String[] {String.valueOf(sms.mPerson)}, null); 
     if(cur != null && 
      cur.moveToFirst()) { 
      int idx = cur.getColumnIndex(PhoneLookup.DISPLAY_NAME); 
      ContactItem item = new ContactItem(); 
      item.mName = cur.getString(idx); 
      return item; 
     } 
     return null; 
    } 

回答

6

好了,因爲沒有人幫助我,我想閱讀一些開源項目的代碼,我得到了現在回答。正如我在一開始就應該,查詢到短信的聯繫人信息的最佳方式,是由號碼查詢(也稱爲地址):

ContactItem getContactByAddr(Context context, final SMSItem sms) { 
    Uri personUri = Uri.withAppendedPath( 
      ContactsContract.PhoneLookup.CONTENT_FILTER_URI, sms.mAddress); 
    Cursor cur = context.getContentResolver().query(personUri, 
      new String[] { PhoneLookup.DISPLAY_NAME }, 
      null, null, null); 
    if(cur.moveToFirst()) { 
     int nameIdx = cur.getColumnIndex(PhoneLookup.DISPLAY_NAME); 
     ContactItem item = new ContactItem(); 
     item.mName = cur.getString(nameIdx); 
     cur.close(); 
     return item; 
    } 
    return null; 

}

+0

感謝張貼您的解決方案。我很感激!你知道......我試着從我上週在網上找到的大約30個樣本中學習,而且他們中沒有一個真正起作用。你們的作品完美無缺。我需要找到一種方法來優化它,因爲屏幕在幾秒鐘內是空白的,同時獲取所有消息和聯繫人 - 但至少它現在獲得所有聯繫人:) – username 2015-12-28 03:40:05