使用过滤器打开联系人选取器

时间:2013-04-27 13:45:24

标签: android android-contacts start-activity

可以轻松打开Android联系人应用程序以显示所有联系人并选择其中一个:

在活动中:

    private int PICK_CONTACT = 853456;

    // ...

    // open contact list
    void openContactPicker() {
        Intent it= new Intent(Intent.ACTION_PICK,  Contacts.CONTENT_URI);
        startActivityForResult(it, PICK_CONTACT);
    }

    // when back from intent: use pick result
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // ...
        switch (requestCode) {
        case PICK_CONTACT:
            if (dataOk(data)) {
                extractContactInfo(data);
            } else {
                showErrorMessage();
            }
            break;
        // ...
    }

但是是否可以设置一些过滤条件,以便联系人应用程序只显示那些具有指定元素的联系人 - 例如完整的邮政信息,或适当的电子邮件,或电话号码?

我的应用需要邮政信息,目前实施的工作流程如下:

  • 用户点击按钮以打开联系人
  • 联系应用已启动,显示所有联系人
  • 用户选择一个
  • 回到我的活动中,检查联系人
    • 可提供邮政信息 - >做正确的事
    • 邮政信息不可用 - >消息框

由于许多联系人没有邮政信息,因此在大多数情况下会显示一个消息框“抱歉没有可用于此联系人的邮政信息”。这不是一种可接受的行为。

另一个选择是 - 我只是实现这个 - 来查询应用程序内的联系人数据库并在我自己的代码中进行过滤,但使用这种方法有一些含义:

  • 该应用需要读取联系人权限,这对许多用户来说可能是不行的
  • 必须实施联系人选择器,这可能看起来与用户熟悉的不同

因此,为Contacts App设置一些标准似乎是一种更优雅的方式。

该应用应在Android 2.3.3及更高版本上运行。

问题:

  1. 在通过startActivityForResult启动时,2.3.3是否可以为Contacts App设置过滤条件(尤其是'has_postal_information')?
  2. 如果没有:是否可以在以后的OS版本上使用?

1 个答案:

答案 0 :(得分:4)

“联系人”应用注册到此意图过滤器

<intent-filter>
    <action android:name="android.intent.action.PICK" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="vnd.android.cursor.dir/contact" />
    <data android:mimeType="vnd.android.cursor.dir/person" />
    <data android:mimeType="vnd.android.cursor.dir/phone_v2" />
    <data android:mimeType="vnd.android.cursor.dir/phone" />
    <data android:mimeType="vnd.android.cursor.dir/postal-address_v2" />
    <data android:mimeType="vnd.android.cursor.dir/postal-address" />
</intent-filter>

所以你可以这样创建你的意图:

private int PICK_CONTACT = 853456;

// ...

// open contact list
void openContactPicker() {
    Intent it= new Intent(Intent.ACTION_PICK,  Contacts.CONTENT_URI);
    it.setType("vnd.android.cursor.dir/postal-address");
    startActivityForResult(it, PICK_CONTACT);
}