如何通过ID在Android中打开联系人名片

16

是否可以通过联系人的ID打开Android联系人卡片?使用电话号码可以实现。这是一个例子,如果我使用

Intent i = new Intent();
i.setAction(ContactsContract.Intents.SHOW_OR_CREATE_CONTACT);
i.setData(Uri.fromParts("tel", "123456", null)); //<---- Change here from Phone to IDcontext.startActivity(i);

但是我想通过ID打开此联系人卡片,例如,如果联系人的电话号码发生更改。

3个回答

44

使用ACTION_VIEW并且通过联系人ID构建联系人URI,或者如果您已经拥有联系人查找URI,则使用它(优先)。

    Intent intent = new Intent(Intent.ACTION_VIEW);
    Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(contactID));
    intent.setData(uri);
context.startActivity(intent);

4
补充说明:不建议使用“id”来选择联系人,因为不能保证其不会改变。实际上,“id”的更改概率非常高。您应该使用jhominal的解决方案,并使用LOOKUP_URI获取它,因为查找键始终保持不变。背景:在同步期间,“ID”可能会发生更改,因此不要依赖它,否则您的应用程序可能会在未来的任何时间在联系人列表同步期间或之后中断。 - Tseng
哇,我显然错过了“id”的含义...谢谢Tseng,我会在我的代码中进行更改,并记住下一次 :) - Java_Waldi
是的,当我将我的一个应用程序从1.6移植到2.x时,我不得不经历那个过程,因为整个联系人系统都被更改了,旧的东西也坏了。 - Tseng
嗨,我需要调用Intent.ACTION_PICK,因为我需要从我的应用程序中选择号码并提取它,但它无法正常工作。有什么想法吗?请建议我如何实现它? - SBJ

6
您将使用以下URI:

您需要使用以下URI:

Uri.Builder newUriBuilder = ContactsContract.Contacts.CONTENT_LOOKUP_URI.buildUpon();
newUriBuilder.appendPath("/").appendPath(theContactKey)
i.setData(newUriBuilder.build());

如果您查看CONTENT_LOOKUP_URI的API文档,您将了解有关此URI如何工作的更多详细信息。


6
谢谢jhominal指出正确的方向,但是他的答案不完全正确。这里是正确的解决方案:Uri look = Uri.withAppendedPath(Contacts.CONTENT_LOOKUP_URI, hereTheLookupKey); Intent i = new Intent(Intent.ACTION_VIEW); i.setData(look); - Java_Waldi
使用这个URI不是更好吗:Contacts.getLookupUri(contactId, lookupKey)? - android developer

4
我试图使用此处列出的方法打开联系人卡片,但是无论如何,联系人活动在打开后立即关闭。
似乎联系人活动没有接受我的旧内容URI。
我使用ContactsContract.Contacts类的getLookupUri(long contactId, String lookupKey)方法解决了这个问题,以获取正确的内容URI https://developer.android.com/reference/android/provider/ContactsContract.Contacts.html#getLookupUri(long, java.lang.String)
因此,打开联系人卡片的代码变为:
Intent intent = new Intent(Intent.ACTION_VIEW);
String lookupKey = phonesCursor.getString(phonesCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.LOOKUP_KEY));
long contactId = phonesCursor.getLong(phonesCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID));
Uri uri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey);
intent.setData(uri);
startActivity(intent);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接