Статьи

Основы Android: использование средства выбора контактов

Из этого туториала вы узнаете не только о том, как запустить средство выбора контактов и получить результаты, но и о том, как использовать эти результаты в Android SDK 2.0 и более поздних версиях.

Это учебное пособие начнется с простого, но затем мы перейдем к некоторым техническим деталям использования Contacts с классом ContactsContract, который был представлен в API Level 5. Убедитесь, что ваша среда разработки Android установлена ​​и настроена правильно. Вы можете свободно использовать любое имеющееся у вас приложение, запускать новое с нуля или следовать за ним, используя код InviteActivity в нашем проекте с открытым исходным кодом .

Затем мы добавим функциональность, позволяющую пользователю выбрать один из своих существующих контактов и отправить ему готовое сообщение. Мы собираемся погрузиться прямо в это, так что весь ваш код и инструменты готовы. Наконец, убедитесь, что на вашем устройстве или эмуляторе настроены некоторые контакты (с именами и адресами электронной почты) в приложении «Контакты».

Для работы средства выбора контактов необходимы два основных элемента управления формой. Во-первых, нам нужно поле 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 является частью большего макета. Вот как это выглядит в дизайнере компоновки, с заполненными строковыми ресурсами:

Использование средства выбора контактов

Теперь вам нужно написать код для обработки нажатия кнопки, которая запустит средство выбора контактов. Одной из самых мощных функций платформы Android является то, что вы можете использовать функциональность других приложений с помощью механизма Intent. Intent может использоваться вместе с методом startActivityForResult () для запуска другого приложения Android и получения результата. В этом случае вы можете использовать Intent для выбора контакта из данных, предоставленных поставщиком контента Contacts.

Вот реализация doLaunchContactPicker ():

Примечание: здесь важны команды импорта. Убедитесь, что вы используете класс Contacts из ContactsContract, а не более старый класс android.provider.Contacts.

После запуска сборщик контактов в вашем приложении будет выглядеть примерно так:

Использование средства выбора контактов

Теперь вы готовы обработать результаты выбора. Как только пользователь нажмет на один из контактов в средстве выбора, фокус вернется к вызывающей активности (активности вашего приложения). Вы можете получить результат из средства выбора контактов, реализовав метод onActivityResult () в своей деятельности. Здесь вы можете проверить, что результат соответствует вашему requestCode и что результат был хорошим. Ваша реализация метода onActivityResult () должна быть структурирована следующим образом:

Вы получите результат, отличный от RESULT_OK, если пользователь отменит операцию или что-то пойдет не так.

Последний параметр onActivityResult — это Intent, называемый «data». Этот параметр содержит данные результатов, которые мы ищем. Разные намерения будут возвращать разные типы результатов. Одним из вариантов проверки результатов является отображение всего найденного в пакете Extras в дополнение к Uri данных. Вот фрагмент кода, который покажет все дополнения, если таковые существуют:

На самом деле нас не интересует пакет Extras для средства выбора контактов, поскольку он не содержит необходимую нам информацию. Мы просто хотим Uri, который приведет нас к важным контактным данным.

В обратном вызове onActivityResult () мы передаем Uri конкретному контакту, выбранному пользователем из средства выбора контактов. Использование этого Uri напрямую позволило бы нам получить основные контактные данные, но без подробностей. Тем не менее, мы заинтересованы в определении адреса электронной почты контакта. Таким образом, простой способ справиться с этим — просто получить идентификатор контакта из Uri, который является числом в конце пути:

Полный Uri выглядит примерно так:

content://com.android.contacts/contacts/lookup/0r7-2C46324E483C324A3A484634/7

В этом случае результирующий идентификатор будет просто 7.
Мы можем получить идентификатор контакта, используя метод getLastPathSegment (), следующим образом:

Теперь, когда у вас есть идентификатор для выбранного контакта, у вас есть вся информация, необходимая для того, чтобы напрямую запросить у поставщика контента для контактов адрес электронной почты этого контакта. Поставщики контента Android — это мощный способ обмена данными между приложениями. Интерфейс к ним похож на интерфейс базы данных, и многие из них защищены базой данных с использованием SQLite, но это не обязательно.

Один из способов запросить у поставщика содержимого контактов соответствующие контактные данные — использовать ContentResolver по умолчанию с одним из подклассов ContactsContract.CommonDataKinds. Для электронной почты вы можете использовать класс ContactsContract.CommonDataKinds.Email следующим образом:

Некоторые другие полезные подклассы ContactsContract.CommonDataKinds включают Телефон, Фото, Веб-сайт, Псевдоним, Организация и StructuredPostal.

Конечно, вы можете прочитать документацию класса для класса ContactsContract.CommonDataKinds.Email и определить, каких результатов ожидать. Однако это не всегда так, поэтому давайте проверим результаты этого вызова. Это очень полезный трюк, если вы работаете с поставщиком контента, который имеет неадекватную документацию или ведет себя не так, как ожидалось.

Этот фрагмент кода покажет вам через выход LogCat каждый столбец и значение, которое возвращается из запроса поставщику контента:

Теперь вы можете видеть, что, действительно, они действительно имели в виду, что электронное письмо возвращалось через столбец с именем DATA1, имеющий псевдоним Email.DATA. Система контактов Android очень гибкая, и этот тип общего названия столбца показывает, откуда взялась эта гибкость. Тип электронной почты, такой как Дом или Работа, находится в Email.TYPE.

У нас есть все данные, которые нам нужны для фактического получения адреса электронной почты или адресов контакта, выбранного пользователем. При использовании курсоров базы данных мы должны убедиться, что они внутренне ссылаются на интересующую нас строку данных, поэтому мы начнем с вызова метода moveToFirst () и убедимся, что он был успешным. В этом уроке мы не будем беспокоиться о нескольких адресах электронной почты. Вместо этого мы просто будем использовать первый результат:

Важно помнить, что у контакта может быть много адресов. Если вы хотите предоставить пользователю возможность выбора из нескольких адресов электронной почты, вы можете отобразить свой собственный инструмент выбора электронной почты, чтобы выбрать один из них после того, как пользователь выбрал определенный контакт.

После всей этой работы, чтобы получить адрес электронной почты, не забудьте обновить форму. Вы также можете рассмотреть вопрос об информировании пользователя, если у контакта не было адреса электронной почты.

И вот оно:

Content Picker

В этом уроке мы пропустили два важных момента, о которых стоит упомянуть.

Во-первых, мы не включили проверку ошибок; мы сделали это для ясности, но в рабочем коде это важный элемент решения. Простой способ реализовать некоторую проверку — это обернуть практически все в блок try-catch.

Во-вторых, вы должны помнить, что объекты Cursor требуют управления в вашем жизненном цикле Activity. Не забывайте выпускать объекты Cursor по окончании их использования.

Вот полная реализация метода onActivityResult (), чтобы представить эти точки в перспективе:

Теперь у вас есть все необходимое для заполнения заявки. Помните, однако, что если вы работаете с реальными данными, постарайтесь не спамить своих друзей слишком много.

Из этого урока вы узнали, как запустить средство выбора контактов и получить выбранный результат. Вы также узнали, как проверять результаты и получать адрес электронной почты для выбранного контакта с помощью поставщика содержимого контактов. Вы можете использовать этот метод для получения всех видов информации о данном контакте.

Разработчики мобильных приложений Лорен Дарси и Шейн Кондер являются соавторами нескольких книг по разработке Android: углубленная книга по программированию под названием « Разработка беспроводных приложений для Android» и « Разработка Android-приложений Sams TeachYourself за 24 часа» . Когда они не пишут, они тратят свое время на разработку мобильного программного обеспечения в своей компании и оказание консультационных услуг. С ними можно связаться по электронной почте [email protected] , через их блог на androidbook.blogspot.com и в Twitter @androidwireless .

Купить Android-разработку беспроводных приложений, 2-е издание Купить Sam's Teach Yourself для Android-разработки приложений в течение 24 часов Код Мамламбо в Код-Каньоне