Из этого туториала вы узнаете не только о том, как запустить средство выбора контактов и получить результаты, но и о том, как использовать эти результаты в Android SDK 2.0 и более поздних версиях.
Начиная
Это учебное пособие начнется с простого, но затем мы перейдем к некоторым техническим деталям использования Contacts с классом ContactsContract, который был представлен в API Level 5. Убедитесь, что ваша среда разработки Android установлена и настроена правильно. Вы можете свободно использовать любое имеющееся у вас приложение, запускать новое с нуля или следовать за ним, используя код InviteActivity в нашем проекте с открытым исходным кодом .
Затем мы добавим функциональность, позволяющую пользователю выбрать один из своих существующих контактов и отправить ему готовое сообщение. Мы собираемся погрузиться прямо в это, так что весь ваш код и инструменты готовы. Наконец, убедитесь, что на вашем устройстве или эмуляторе настроены некоторые контакты (с именами и адресами электронной почты) в приложении «Контакты».
Шаг 1: Создание вашего макета
Для работы средства выбора контактов необходимы два основных элемента управления формой. Во-первых, нам нужно поле EditText, в котором будет отображаться полученное письмо. Во-вторых, нам нужен какой-то способ для запуска средства выбора контактов. Кнопка управления хорошо работает для этого.
В следующем сегменте макета оба эти элемента определены соответствующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
<RelativeLayout
android:layout_height=»wrap_content»
android:layout_width=»match_parent»>
<EditText
android:layout_height=»wrap_content»
android:hint=»@string/invite_email_hint»
android:id=»@+id/invite_email»
android:inputType=»textEmailAddress»
android:layout_width=»wrap_content»
android:layout_toLeftOf=»@+id/do_email_picker»
android:layout_alignParentLeft=»true»></EditText>
<Button
android:layout_width=»wrap_content»
android:layout_height=»wrap_content»
android:id=»@+id/do_email_picker»
android:text=»@string/pick_email_label»
android:layout_alignParentRight=»true»
android:onClick=»doLaunchContactPicker»></Button>
</RelativeLayout>
|
Этот макет XML является частью большего макета. Вот как это выглядит в дизайнере компоновки, с заполненными строковыми ресурсами:
Шаг 2: Запуск средства выбора контактов
Теперь вам нужно написать код для обработки нажатия кнопки, которая запустит средство выбора контактов. Одной из самых мощных функций платформы Android является то, что вы можете использовать функциональность других приложений с помощью механизма Intent. Intent может использоваться вместе с методом startActivityForResult () для запуска другого приложения Android и получения результата. В этом случае вы можете использовать Intent для выбора контакта из данных, предоставленных поставщиком контента Contacts.
Вот реализация doLaunchContactPicker ():
import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.CommonDataKinds.Email; приватный статический финал int CONTACT_PICKER_RESULT = 1001; public void doLaunchContactPicker (Просмотр представления) { Intent contactPickerIntent = новое намерение (Intent.ACTION_PICK, Contacts.CONTENT_URI); startActivityForResult (contactPickerIntent, CONTACT_PICKER_RESULT); }
Примечание: здесь важны команды импорта. Убедитесь, что вы используете класс Contacts из ContactsContract, а не более старый класс android.provider.Contacts.
После запуска сборщик контактов в вашем приложении будет выглядеть примерно так:
Шаг 3: обработка результатов
Теперь вы готовы обработать результаты выбора. Как только пользователь нажмет на один из контактов в средстве выбора, фокус вернется к вызывающей активности (активности вашего приложения). Вы можете получить результат из средства выбора контактов, реализовав метод onActivityResult () в своей деятельности. Здесь вы можете проверить, что результат соответствует вашему requestCode и что результат был хорошим. Ваша реализация метода onActivityResult () должна быть структурирована следующим образом:
защищенный void onActivityResult (int requestCode, int resultCode, данные намерений) {if (resultCode == RESULT_OK) {switch (requestCode) {case CONTACT_PICKER_RESULT: // обрабатывать результаты контактов break; }} else {// изящно обрабатывать сбой Log.w (DEBUG_TAG, «Предупреждение: результат действия не в порядке»); }}
Вы получите результат, отличный от RESULT_OK, если пользователь отменит операцию или что-то пойдет не так.
Шаг 4: Чтение данных результата
Последний параметр onActivityResult — это Intent, называемый «data». Этот параметр содержит данные результатов, которые мы ищем. Разные намерения будут возвращать разные типы результатов. Одним из вариантов проверки результатов является отображение всего найденного в пакете Extras в дополнение к Uri данных. Вот фрагмент кода, который покажет все дополнения, если таковые существуют:
Bundle extras = data.getExtras (); Устанавливатьkeys = extras.keySet (); Итератор iterate = keys.iterator (); while (iterate.hasNext ()) { String key = iterate.next (); Log.v (DEBUG_TAG, ключ + "[" + extras.get (ключ) + "]"); } Uri result = data.getData (); Log.v (DEBUG_TAG, "Получил результат:" + result.toString ());
На самом деле нас не интересует пакет Extras для средства выбора контактов, поскольку он не содержит необходимую нам информацию. Мы просто хотим Uri, который приведет нас к важным контактным данным.
Шаг 5: Понимание результата
В обратном вызове onActivityResult () мы передаем Uri конкретному контакту, выбранному пользователем из средства выбора контактов. Использование этого Uri напрямую позволило бы нам получить основные контактные данные, но без подробностей. Тем не менее, мы заинтересованы в определении адреса электронной почты контакта. Таким образом, простой способ справиться с этим — просто получить идентификатор контакта из Uri, который является числом в конце пути:
Полный Uri выглядит примерно так:
content://com.android.contacts/contacts/lookup/0r7-2C46324E483C324A3A484634/7
В этом случае результирующий идентификатор будет просто 7.
Мы можем получить идентификатор контакта, используя метод getLastPathSegment (), следующим образом:
// получаем контактный идентификатор из Uri String id = result.getLastPathSegment ();
Шаг 6: Запрос базы данных контактов для электронной почты
Теперь, когда у вас есть идентификатор для выбранного контакта, у вас есть вся информация, необходимая для того, чтобы напрямую запросить у поставщика контента для контактов адрес электронной почты этого контакта. Поставщики контента Android — это мощный способ обмена данными между приложениями. Интерфейс к ним похож на интерфейс базы данных, и многие из них защищены базой данных с использованием SQLite, но это не обязательно.
Один из способов запросить у поставщика содержимого контактов соответствующие контактные данные — использовать ContentResolver по умолчанию с одним из подклассов ContactsContract.CommonDataKinds. Для электронной почты вы можете использовать класс ContactsContract.CommonDataKinds.Email следующим образом:
// запрашиваем все по электронной почте курсор = getContentResolver (). запрос ( Email.CONTENT_URI, null, Email.CONTACT_ID + "=?", новая строка [] {id}, ноль);
Некоторые другие полезные подклассы ContactsContract.CommonDataKinds включают Телефон, Фото, Веб-сайт, Псевдоним, Организация и StructuredPostal.
Шаг 7: Просмотр результатов запроса
Конечно, вы можете прочитать документацию класса для класса ContactsContract.CommonDataKinds.Email и определить, каких результатов ожидать. Однако это не всегда так, поэтому давайте проверим результаты этого вызова. Это очень полезный трюк, если вы работаете с поставщиком контента, который имеет неадекватную документацию или ведет себя не так, как ожидалось.
Этот фрагмент кода покажет вам через выход LogCat каждый столбец и значение, которое возвращается из запроса поставщику контента:
cursor.moveToFirst (); Строковые столбцы [] = cursor.getColumnNames (); for (Строка столбец: столбцы) { int index = cursor.getColumnIndex (column); Log.v (DEBUG_TAG, "Столбец:" + столбец + "== [" + cursor.getString (index) + "]");
Теперь вы можете видеть, что, действительно, они действительно имели в виду, что электронное письмо возвращалось через столбец с именем DATA1, имеющий псевдоним Email.DATA. Система контактов Android очень гибкая, и этот тип общего названия столбца показывает, откуда взялась эта гибкость. Тип электронной почты, такой как Дом или Работа, находится в Email.TYPE.
Шаг 8: Получение электронной почты
У нас есть все данные, которые нам нужны для фактического получения адреса электронной почты или адресов контакта, выбранного пользователем. При использовании курсоров базы данных мы должны убедиться, что они внутренне ссылаются на интересующую нас строку данных, поэтому мы начнем с вызова метода moveToFirst () и убедимся, что он был успешным. В этом уроке мы не будем беспокоиться о нескольких адресах электронной почты. Вместо этого мы просто будем использовать первый результат:
if (cursor.moveToFirst ()) { int emailIdx = cursor.getColumnIndex (Email.DATA); email = cursor.getString (emailIdx); Log.v (DEBUG_TAG, "Получил электронную почту:" + электронная почта); }
Важно помнить, что у контакта может быть много адресов. Если вы хотите предоставить пользователю возможность выбора из нескольких адресов электронной почты, вы можете отобразить свой собственный инструмент выбора электронной почты, чтобы выбрать один из них после того, как пользователь выбрал определенный контакт.
Шаг 9: Обновление формы
После всей этой работы, чтобы получить адрес электронной почты, не забудьте обновить форму. Вы также можете рассмотреть вопрос об информировании пользователя, если у контакта не было адреса электронной почты.
EditText emailEntry = (EditText) findViewById (R.id.invite_email); emailEntry.setText (электронная почта); if (email.length () == 0) { Toast.makeText (это, «адрес электронной почты не найден для контакта.», Toast.LENGTH_LONG) .show (); }
И вот оно:
Шаг 10: Соединяем все вместе
В этом уроке мы пропустили два важных момента, о которых стоит упомянуть.
Во-первых, мы не включили проверку ошибок; мы сделали это для ясности, но в рабочем коде это важный элемент решения. Простой способ реализовать некоторую проверку — это обернуть практически все в блок try-catch.
Во-вторых, вы должны помнить, что объекты Cursor требуют управления в вашем жизненном цикле Activity. Не забывайте выпускать объекты Cursor по окончании их использования.
Вот полная реализация метода onActivityResult (), чтобы представить эти точки в перспективе:
@Override protected void onActivityResult (int requestCode, int resultCode, данные намерения) { if (resultCode == RESULT_OK) { switch (requestCode) { case CONTACT_PICKER_RESULT: Курсор курсор = ноль; String email = ""; пытаться { Uri result = data.getData (); Log.v (DEBUG_TAG, "Получил контактный результат:" + result.toString ()); // получаем контактный идентификатор из Uri String id = result.getLastPathSegment (); // запрашиваем все по электронной почте cursor = getContentResolver (). query (Email.CONTENT_URI, null, Email.CONTACT_ID + "=?", новая строка [] {id}, значение NULL); int emailIdx = cursor.getColumnIndex (Email.DATA); // давайте просто получим первое письмо if (cursor.moveToFirst ()) { email = cursor.getString (emailIdx); Log.v (DEBUG_TAG, "Получил электронную почту:" + электронная почта); } еще { Log.w (DEBUG_TAG, "Нет результатов"); } } catch (исключение e) { Log.e (DEBUG_TAG, «Не удалось получить данные электронной почты», e); } наконец { if (курсор! = ноль) { cursor.close (); } EditText emailEntry = (EditText) findViewById (R.id.invite_email); emailEntry.setText (электронная почта); if (email.length () == 0) { Toast.makeText (это "Электронная почта не найдена для контакта.", Toast.LENGTH_LONG) .Show (); } } перемена; } } еще { Log.w (DEBUG_TAG, «Предупреждение: результат деятельности не в порядке»); } }
Теперь у вас есть все необходимое для заполнения заявки. Помните, однако, что если вы работаете с реальными данными, постарайтесь не спамить своих друзей слишком много. ☺
Вывод
Из этого урока вы узнали, как запустить средство выбора контактов и получить выбранный результат. Вы также узнали, как проверять результаты и получать адрес электронной почты для выбранного контакта с помощью поставщика содержимого контактов. Вы можете использовать этот метод для получения всех видов информации о данном контакте.
Об авторах
Разработчики мобильных приложений Лорен Дарси и Шейн Кондер являются соавторами нескольких книг по разработке Android: углубленная книга по программированию под названием « Разработка беспроводных приложений для Android» и « Разработка Android-приложений Sams TeachYourself за 24 часа» . Когда они не пишут, они тратят свое время на разработку мобильного программного обеспечения в своей компании и оказание консультационных услуг. С ними можно связаться по электронной почте [email protected] , через их блог на androidbook.blogspot.com и в Twitter @androidwireless .