Сборщик открытых контактов с фильтром

Приложение Android Contact App легко открыть, чтобы показать все контакты и выбрать один из них:

в деятельности:

    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. Возможно ли в 2.3.3 установить критерии фильтра (особенно такие, как "has_postal_information") для приложения "Контакты" при запуске его через startActivityForResult?
  2. Если нет: возможно ли это в более поздних версиях ОС?

1 ответ

Приложение "Контакты" регистрируется в этом фильтре намерений.

<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);
}
Другие вопросы по тегам