通讯录应用中的自定义操作(类似于G+)

7
我正在创建一个应用程序,我希望将其与Android的联系人/人物应用程序集成。我设置了自定义MIME类型、同步适配器和一个包含ContactsDataKind元素的contacts.xml文件。
这似乎很好地工作着,但似乎不可能为每个数据类型定义多个操作(在这种情况下,我希望人们能够查看联系人资料,以及直接向他们发送消息)。
G+应用程序似乎处理了这个问题,但我无法弄清楚他们是如何做到的。下面是People中G+集成的屏幕截图: http://i.imgur.com/QotHjDk.png 感谢您花费时间!

我不清楚你想做什么。你是想让你的应用程序出现在联系人/人员内部弹出的菜单中,还是想在你的应用程序中有多个操作选项?在我的手机上,我能够看到像你链接的截图一样的屏幕的方法是进入电话应用程序,在那里触摸一个人的瓷砖上的菜单按钮(三个垂直对齐的点),这会带来一个包含该人联系信息的对话框,然后触摸该对话框中的联系人图标。此时,我不确定我是否仍在电话应用程序或联系人/人员应用程序中。 - hBrent
1个回答

10
你只需在插入联系人时,在ContactsContract.Data表中添加附加行即可。请参阅documentation中的“contacts.xml结构”部分:

The <ContactsDataKind> element controls the display of your application's custom data rows in the contacts application's UI. It has the following syntax:

<ContactsDataKind
    android:mimeType="MIMEtype"
    android:icon="icon_resources"
    android:summaryColumn="column_name"
    android:detailColumn="column_name">
对于每一个联系人,联系人应用ContactDetailFragment都会添加一个DataViewEntry。列表条目充当了构建联系人详细信息界面所需的适配器数据。当点击包含意图的条目时,将调用startActivity()。该意图是由数据项的MIME类型和Uri构建而成的。
entry.intent = new Intent(Intent.ACTION_VIEW);
entry.intent.setDataAndType(entry.uri, entry.mimetype);

例如,G+应用程序有以下es_contacts.xml文件:
<ContactsDataKind android:summaryColumn="data2" android:detailColumn="data3"

并创建如下行:

ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
    .withValueBackReference("raw_contact_id", i1)
    .withValue("mimetype", "vnd.android.cursor.item/vnd.googleplus.profile.comm")
    .withValue("data4", Integer.valueOf(14))
    .withValue("data5", "hangout")
    .withValue("data3", context.getString(R.string.start_hangout_action_label));

ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
    .withValueBackReference("raw_contact_id", i1)
    .withValue("mimetype", "vnd.android.cursor.item/vnd.googleplus.profile")
    .withValue("data4", Integer.valueOf(20))
    .withValue("data5", "addtocircle")
    .withValue("data3", context.getString(R.string.add_to_circle_action_label));

当我使用多个MIME类型时,我的应用程序在快速联系弹出窗口中出现了多次(滑块中的多个页面)。每个页面只有一个操作。这是我的设置问题还是我可以通过其他方式解决? - Quint Stoffers
@matiash,你在哪里找到G+应用程序的源代码? - kierans
2
@kierans 我没有,只是用 dex2jar 来反编译它。 - matiash
1
android:summaryColumn="data2"android:detailColumn="data3"的含义是什么?为什么它们不在同一行中(data2,3),而值却设置在data3,4,5中? - Cătălin Florescu
1
嗨..我实现了这段代码,并在联系人中添加了自定义行,但当我点击该行时,它会显示“找不到处理此操作的应用程序”。我需要在哪里定义打开我的应用程序的操作? - AndiM

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