Изменение контактов использую намерения

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

Использование Intent для добавления или обновления одного контакта является более предпочтительным способом изменения поставщика контактов, по следующим причинам:

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

Добавление нового контакта, используя намерения

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

Вставка контакта через приложение контактов вставляет новый сырой контакт в поставщика контактов в ContactsContract.RawContacts таблицу. В случае необходимости, приложение контактов предлагает пользователям выбрать тип учетной записи и запись для использования при создании сырого контакта. Приложение контактов также уведомляет пользователей, если контакт уже существует. Затем пользователи имеют возможность отменить вставку, и в этом случае никакого контакта не создается. Чтобы узнать больше о сырых контактах, см. Поставщик Контактов руководство по API.

Создание намерения

Для начала, создайте новый Intent объект с действием Intents.Insert.ACTION. Установите MIME тип в RawContacts.CONTENT_TYPE. Например:

...
// Creates a new Intent to insert a contact
Intent intent = new Intent(Intents.Insert.ACTION);
// Sets the MIME type to match the Contacts Provider
intent.setType(ContactsContract.RawContacts.CONTENT_TYPE);

Если у вас уже есть детали для контакта, например, номер телефона или адрес электронной почты, вы можете вставить их в намерение в качестве расширенных данных. Для ключевого значения, используйте соответствующую константу из Intents.Insert. Приложение контактов отображает данные в своем экране ввода, что позволяет пользователям продолжить редактирование.

/* Assumes EditText fields in your UI contain an email address
 * and a phone number.
 *
 */
private EditText mEmailAddress = (EditText) findViewById(R.id.email);
private EditText mPhoneNumber = (EditText) findViewById(R.id.phone);
...
/*
 * Inserts new data into the Intent. This data is passed to the
 * contacts app's Insert screen
 */
// Inserts an email address
intent.putExtra(Intents.Insert.EMAIL, mEmailAddress.getText())
/*
 * In this example, sets the email type to be a work email.
 * You can set other email types as necessary.
 */
      .putExtra(Intents.Insert.EMAIL_TYPE, CommonDataKinds.Email.TYPE_WORK)
// Inserts a phone number
      .putExtra(Intents.Insert.PHONE, mPhoneNumber.getText())
/*
 * In this example, sets the phone type to be a work phone.
 * You can set other phone types as necessary.
 */
      .putExtra(Intents.Insert.PHONE_TYPE, Phone.TYPE_WORK);

Как только вы создали Intent, отправите его, вызвав startActivity().

    /* Sends the Intent
     */
    startActivity(intent);

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

Изменение существующего контакта, используя намерения

Редактирование существующего контакта, используя Intent полезно, если пользователь уже выбрал контакт. Например, приложение, которое ищет контакты, которые имеют почтовые адреса, но не имеют почтовый индекс, может дать пользователям возможность найти код, а затем добавить его в контакт.

Чтобы изменить существующий контакт, используя намерение, используйте методику аналогичную добавлению контакта. Создайте намерение, как описано в разделе Добавление нового контакта, используя намерения, но добавьте для контакта Contacts.CONTENT_LOOKUP_URI и MIME тип Contacts.CONTENT_ITEM_TYPE в намерение. Если вы хотите изменить контакт, используя имеющуюся у вас подробную информацию, вы можете положить её в расширенных данные намерения. Обратите внимание, что некоторые имена столбцов не могут быть изменены с помощью намерения; эти колонки перечислены в заключительном разделе API для класса ContactsContract.Contacts под заголовком "Обновление".

Наконец, отправьте намерение. В ответ на это, приложение контактов отобразит экран редактирования. Когда пользователь заканчивает редактирование и сохраняет изменения, приложение контактов отображает список контактов. Когда пользователь нажимает кнопку Назад, отображается ваше приложение.

Создание намерения

Для изменения контакта, вызовите Intent(action) для создания намерения с действием ACTION_EDIT. Вызовите setDataAndType() для установки данных намерения для контакта Contacts.CONTENT_LOOKUP_URI и MIME тип в Contacts.CONTENT_ITEM_TYPE ; поскольку вызов setType() перезаписывает текущее значение данных для Intent, вы должны установить данные и MIME тип одновременно.

Чтобы получить для контакта Contacts.CONTENT_LOOKUP_URI, вызовите Contacts.getLookupUri(id, lookupkey) с соответствующими контакту Contacts._ID и Contacts.LOOKUP_KEY значениями в качестве аргументов.

Следующий фрагмент показывает, как создать намерение:

    // The Cursor that contains the Contact row
    public Cursor mCursor;
    // The index of the lookup key column in the cursor
    public int mLookupKeyIndex;
    // The index of the contact's _ID value
    public int mIdIndex;
    // The lookup key from the Cursor
    public String mCurrentLookupKey;
    // The _ID value from the Cursor
    public long mCurrentId;
    // A content URI pointing to the contact
    Uri mSelectedContactUri;
    ...
    /*
     * Once the user has selected a contact to edit,
     * this gets the contact's lookup key and _ID values from the
     * cursor and creates the necessary URI.
     */
    // Gets the lookup key column index
    mLookupKeyIndex = mCursor.getColumnIndex(Contacts.LOOKUP_KEY);
    // Gets the lookup key value
    mCurrentLookupKey = mCursor.getString(mLookupKeyIndex);
    // Gets the _ID column index
    mIdIndex = mCursor.getColumnIndex(Contacts._ID);
    mCurrentId = mCursor.getLong(mIdIndex);
    mSelectedContactUri =
            Contacts.getLookupUri(mCurrentId, mCurrentLookupKey);
    ...
    // Creates a new Intent to edit a contact
    Intent editIntent = new Intent(Intent.ACTION_EDIT);
    /*
     * Sets the contact URI to edit, and the data type that the
     * Intent must match
     */
    editIntent.setDataAndType(mSelectedContactUri,Contacts.CONTENT_ITEM_TYPE);

Добавление флага навигации

В Android 4.0 (API версии 14) и старше, проблема в приложении контактов вызывает неправильную навигацию. Когда ваше приложение посылает намерение редактирования в приложение контактов, и пользователь заканчивает редактирование и сохраняет контакт, когда они нажимают Назад они видят экран со списком контактов. Для возвращения в ваше приложение, они должны нажать Недавние и выбрать приложение.

Чтобы обойти эту проблему в Android 4.0.3 (API версии 15) и старше, добавьте расширенные данные с ключом finishActivityOnSaveCompleted в намерение, со значением true. Android до версии Android 4.0 принимают этот ключ, но это не дает никакого эффекта. Для установки расширенных данных, выполните следующие действия:

    // Sets the special extended data for navigation
    editIntent.putExtra("finishActivityOnSaveCompleted", true);

Добавление других расширенных данных

Чтобы добавить дополнительные расширенные данные в Intent, вызовите putExtra() по необходимости. Вы можете добавить расширенные данные для общих полей контактов с помощью ключевых значений, указанных в Intents.Insert. Помните, что некоторые столбцы в ContactsContract.Contacts таблице не могут быть изменены. Эти колонны приведены в итоговой части документации по API для класса ContactsContract.Contacts под заголовком "Обновление".

Отправка намерения

Наконец, отправьте намерение, которое вы сконструировали. Например:

    // Sends the Intent
    startActivity(editIntent);

Дать пользователю выбор: вставить или отредактировать, используя намерения

Вы можете позволить пользователям выбрать, следует ли вставить контакт или обновить существующий, отправив Intent с действием ACTION_INSERT_OR_EDIT. Например, клиентское приложение электронной почты может разрешить пользователям добавлять адреса входящей электронной почты, создавая новый контакт или добавляя его в качестве дополнительного адреса для существующего контакта. Установите MIME тип для этого намерения в Contacts.CONTENT_ITEM_TYPE, но не устанавливайте URI данных.

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

    // Creates a new Intent to insert or edit a contact
    Intent intentInsertEdit = new Intent(Intent.ACTION_INSERT_OR_EDIT);
    // Sets the MIME type
    intentInsertEdit.setType(Contacts.CONTENT_ITEM_TYPE);
    // Add code here to insert extended data, if desired
    ...
    // Sends the Intent with an request ID
    startActivity(intentInsertEdit);