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