如何通过电话号码获取联系人ID

Posted

技术标签:

【中文标题】如何通过电话号码获取联系人ID【英文标题】:How to get contact id by phone number 【发布时间】:2012-06-09 13:28:22 【问题描述】:

我将手机的通话记录查询到 ListView 中。因此,当用户长按某个项目时,会出现一个对话框,其中包含“查看联系人”等选项。为了能够查看联系人,意图需要联系人 ID。 我的问题是我并不总是能看到正确的联系人。我点击彼得,然后彼得的联系表出现了。我点击 Sarah,Jason 的联系表出现了。

我一定是错误地使用了这段代码。请帮忙。

ContentResolver contentResolver = getContentResolver();

Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phone));

Cursor cursor =  contentResolver.query(uri, new String[] PhoneLookup.DISPLAY_NAME, PhoneLookup._ID, null, null, null);

if(cursor!=null) 
      while(cursor.moveToNext())
      
        String contactName = cursor.getString(cursor.getColumnIndexOrThrow(PhoneLookup.DISPLAY_NAME));
        contactid2 = cursor.getString(cursor.getColumnIndexOrThrow(PhoneLookup._ID));
        
        cursor.close();


Intent intent_contacts = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people/" + contactid2));
 startActivity(intent_contacts);

也许我需要的不是 PhoneLookup._ID,而是其他一些 ID。

我也尝试了 Felipe 的回答 here,同样的情况。

编辑:

在 HTC Desire HD (2.3.5) 上,我在 99% 的 案例。 在 ZTE Blade (2.2) 上,我在 60% 的情况下都能获得正确的接触。 在三星 Galaxy Ace (2.3.3) 上,我在 5% 的情况下获得了正确的联系人。

这到底是怎么回事???

【问题讨论】:

【参考方案1】:

在深入研究主题后,我在 googlegroups 上找到了 sven 的帮助。问题是我使用了一个过时的意图。我阅读了开发者网站上的许多页面,我一定是不知何故错过了它。

我还发布了完整的代码。

contactid26 = null;

ContentResolver contentResolver = getContentResolver();

Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phonenumintolist));

Cursor cursor =  
contentResolver.query(
    uri, 
    new String[] PhoneLookup.DISPLAY_NAME, PhoneLookup._ID, 
    null, 
    null, 
    null);

    if(cursor!=null) 
        while(cursor.moveToNext())
            String contactName = cursor.getString(cursor.getColumnIndexOrThrow(PhoneLookup.DISPLAY_NAME));
            contactid26 = cursor.getString(cursor.getColumnIndexOrThrow(PhoneLookup._ID));

        
        cursor.close();
    
    if (contactid26 == null) 
        Toast.makeText(DetailedCallHistory.this, "No contact found associated with this number", Toast.LENGTH_SHORT).show();
    
    else 
        Intent intent_contacts = new Intent(Intent.ACTION_VIEW, Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(contactid26)));
        //Intent intent_contacts = new Intent(Intent.ACTION_VIEW, Uri.parse("content://contacts/people/" + contactid26));
        startActivity(intent_contacts);
    

【讨论】:

为什么是 26?为什么是 26 岁?【参考方案2】:

在这种情况下,我将向您展示如何获取 ID,以及 您输入并想要搜索的任何联系人的姓名,对于 例如,如果您输入 no 并想搜索其名称和 id,则使用 这段代码,它工作 100%,如果你想进一步修改 这个,那你可以告诉我

         Uri lookupUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,Uri.encode(phnno.getText().toString()));//phone no 
         String[] proj = new String[] 
           ///as we need only this colum from a table...
             Contacts.DISPLAY_NAME,
             Contacts._ID,
            ;
         String id=null;
         String sortOrder1 = StructuredPostal.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
         Cursor crsr = getContentResolver().query(lookupUri,proj, null, null, sortOrder1);
     while(crsr.moveToNext())
     
         String name=crsr.getString(crsr.getColumnIndex(Contacts.DISPLAY_NAME));
          id = crsr.getString(crsr.getColumnIndex(Contacts._ID));
          Toast.makeText(this,"Name of this cntct is   : " +name +"\n id is : "+id ,Toast.LENGTH_SHORT).show();
     
    crsr.close();

【讨论】:

以上是关于如何通过电话号码获取联系人ID的主要内容,如果未能解决你的问题,请参考以下文章

通过 ID 获取联系电话号码 - 空光标

如何从联系人中获取电子邮件和姓氏?

如何从联系人列表中获取电子邮件 ID、姓名和号码

在 Android 上通过电话号码获取联系人

使用syncadapter将联系人添加到电话簿后如何获取联系人的Contact_Id?

Android快速获取联系人