6

打开 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;
        // ...
    }

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

我的应用程序需要邮政信息,当前实现的工作流程是这样的:

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

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

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

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

因此,为联系人应用程序设置一些标准似乎是一种更优雅的方式。

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

问题:

  1. 在通过 startActivityForResult 启动联系人应用程序时,是否可以在 2.3.3 上为联系人应用程序设置过滤条件(尤其是诸如“has_postal_information”之类的东西)?
  2. 如果没有:是否可以在更高版本的操作系统上使用?
4

1 回答 1

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);
}
于 2014-05-28T15:30:55.710 回答