インテントを使用して連絡先を編集する

このレッスンでは、Intent を使用して新しい連絡先を挿入するか、 連絡先のデータを変更できます。連絡先プロバイダに直接アクセスするのではなく、 Intent が連絡帳アプリを起動し、これにより適切な Activity。このレッスンで説明する変更アクションでは Intent で拡張データを送信すると、そのデータは 開始された Activity

Intent を使用して単一の連絡先の挿入や更新を行う方法は、連絡先プロバイダを編集する方法として適しています。たとえば、以下のようなメリットがあります。

  • 独自の UI とコードを開発する時間と労力を節約できます。
  • これにより、仕様に従っていない変更によって生じるエラーの発生を防止できます。 連絡先プロバイダのルール。
  • これにより、リクエストする権限の数を減らすことができます。アプリに権限は必要ありません 連絡先プロバイダに書き込む必要があります。これは、連絡先アプリへの変更を連絡先プロバイダに委任するためです。 その権限をすでに持っています

インテントを使用して新しい連絡先を挿入する

アプリが新しいデータを受信したときに、ユーザーが新しい連絡先を挿入できるようにしたい場合があります。対象 たとえばレストランのレビューアプリでは 確認しています。インテントを使用してこの処理を行うには、利用可能なデータをすべて使用してインテントを作成し、連絡先アプリにインテントを送信します。

連絡帳アプリを使用して連絡先を挿入すると、新しい未加工連絡先が連絡先に挿入されます。 プロバイダの ContactsContract.RawContacts テーブル。必要に応じて、連絡先アプリは、未加工連絡先を作成する際に使用するアカウント タイプとアカウント名をユーザーに求めます。連絡先アプリは、未加工の連絡先がすでに存在する場合もユーザーに通知します。ユーザーは 挿入をキャンセルするオプションもあります。この場合、連絡先は作成されません。未加工連絡先について詳しくは、Contacts Provider API ガイドをご覧ください。

インテントを作成する

まず、アクションを使用して新しい Intent オブジェクトを作成します。 Intents.Insert.ACTION。 MIME タイプを RawContacts.CONTENT_TYPE に設定します。次に例を示します。

Kotlin

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

Java

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

電話番号やメールアドレスなど、連絡先の詳細がすでにある場合は、それらを拡張データとしてインテントに挿入できます。Key-Value には、適切な定数を Intents.Insert。連絡帳アプリ その挿入画面にデータが表示され、ユーザーはさらに編集や追加を行うことができます。

Kotlin

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

Java

private EditText emailAddress = null;
private EditText phoneNumber = null;
...
/* Assumes EditText fields in your UI contain an email address
 * and a phone number.
 *
 */
emailAddress = (EditText) findViewById(R.id.email);
phoneNumber = (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(ContactsContract.Intents.Insert.EMAIL, emailAddress.getText())
/*
 * In this example, sets the email type to be a work email.
 * You can set other email types as necessary.
 */
      .putExtra(ContactsContract.Intents.Insert.EMAIL_TYPE,
            ContactsContract.CommonDataKinds.Email.TYPE_WORK)
// Inserts a phone number
      .putExtra(ContactsContract.Intents.Insert.PHONE, phoneNumber.getText())
/*
 * In this example, sets the phone type to be a work phone.
 * You can set other phone types as necessary.
 */
      .putExtra(ContactsContract.Intents.Insert.PHONE_TYPE,
            ContactsContract.CommonDataKinds.Phone.TYPE_WORK);

Intent を作成したら、startActivity() を呼び出して送信します。

Kotlin

    /* Sends the Intent
     */
    startActivity(intent)

Java

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

この呼び出しによって、ユーザーが新しい連絡先を入力できる連絡先アプリの画面が開きます。「 連絡先のアカウントタイプとアカウント名が画面上部に表示されます。ユーザーがデータを入力して [完了] をクリックすると、連絡先アプリの連絡先リストが表示されます。ユーザーは [戻る] をクリックしてアプリに戻ります。

インテントを使用して既存の連絡先を編集する

Intent を使用して既存の連絡先を編集すると、 は、すでに連絡先を選択しています。たとえば、連絡先に登録している連絡先を 郵便番号が欠けている場合 ユーザーはコードを検索して 連絡先に追加します

インテントを使用して既存の連絡先を編集する手順は、次のとおりです。 連絡先の挿入などができますインテントを使用して新しい連絡先を挿入するの説明に沿って、インテントを作成します。ただし、連絡先の Contacts.CONTENT_LOOKUP_URIContacts.CONTENT_ITEM_TYPE MIME タイプをインテントに追加します。入手済みの詳細情報を使用して連絡先を編集したい場合は、インテントの拡張データに追加します。一部の Pod には、 インテントを使用して名前の列を編集することはできません。これらの列は概要セクションに クラス ContactsContract.Contacts の API リファレンスのセクション [更新]をクリックします

最後に、インテントを送信します。レスポンスとして、連絡先アプリが編集画面を表示します。ユーザーが編集を終了して保存すると、連絡先アプリは、連絡先リストを表示します。ユーザーが [戻る] をクリックすると、アプリが表示されます。

インテントを作成する

連絡先を編集するには、Intent(action) を呼び出して アクション ACTION_EDIT でインテントを作成します。発信 setDataAndType() を使用して、 MIME タイプを連絡先の Contacts.CONTENT_LOOKUP_URI にマッピングし、 Contacts.CONTENT_ITEM_TYPE MIME タイプ呼び出しは setType() は、現在のデータ値を上書きします。 Intent の場合は、データと MIME タイプを同時に設定する必要があります。

連絡先の Contacts.CONTENT_LOOKUP_URI を取得するには、連絡先の Contacts._ID 値と Contacts.LOOKUP_KEY 値を引数として、Contacts.getLookupUri(id, lookupkey) を呼び出します。

注: 連絡先の LOOKUP_KEY の値は 連絡先の取得に使用する識別子です。プロバイダが内部操作を処理するために連絡先の行 ID を変更しても、一定のままです。

次のスニペットは、インテントを作成する方法を示しています。

Kotlin

    // The Cursor that contains the Contact row
    var mCursor: Cursor? = null
    // The index of the lookup key column in the cursor
    var lookupKeyIndex: Int = 0
    // The index of the contact's _ID value
    var idIndex: Int = 0
    // The lookup key from the Cursor
    var currentLookupKey: String? = null
    // The _ID value from the Cursor
    var currentId: Long = 0
    // A content URI pointing to the contact
    var selectedContactUri: Uri? = null
    ...
    /*
     * 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.
     */
    mCursor?.apply {
        // Gets the lookup key column index
        lookupKeyIndex = getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)
        // Gets the lookup key value
        currentLookupKey = getString(lookupKeyIndex)
        // Gets the _ID column index
        idIndex = getColumnIndex(ContactsContract.Contacts._ID)
        currentId = getLong(idIndex)
        selectedContactUri = ContactsContract.Contacts.getLookupUri(currentId, mCurrentLookupKey)
    }

    // Creates a new Intent to edit a contact
    val editIntent = Intent(Intent.ACTION_EDIT).apply {
        /*
         * Sets the contact URI to edit, and the data type that the
         * Intent must match
         */
        setDataAndType(selectedContactUri, ContactsContract.Contacts.CONTENT_ITEM_TYPE)
    }

Java

    // The Cursor that contains the Contact row
    public Cursor mCursor;
    // The index of the lookup key column in the cursor
    public int lookupKeyIndex;
    // The index of the contact's _ID value
    public int idIndex;
    // The lookup key from the Cursor
    public String currentLookupKey;
    // The _ID value from the Cursor
    public long currentId;
    // A content URI pointing to the contact
    Uri selectedContactUri;
    ...
    /*
     * 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
    lookupKeyIndex = mCursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY);
    // Gets the lookup key value
    currentLookupKey = mCursor.getString(lookupKeyIndex);
    // Gets the _ID column index
    idIndex = mCursor.getColumnIndex(ContactsContract.Contacts._ID);
    currentId = mCursor.getLong(idIndex);
    selectedContactUri =
            Contacts.getLookupUri(currentId, 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(selectedContactUri, ContactsContract.Contacts.CONTENT_ITEM_TYPE);

ナビゲーション フラグを追加する

Android 4.0(API バージョン 14)以降で、連絡先アプリの問題が原因で ナビゲーションです。アプリが連絡先アプリに編集インテントを送信し、ユーザーが連絡先を編集して保存した後、[戻る] をタップすると、連絡先リスト画面が表示されてしまいます。戻るには [最近] をクリックしてアプリを選択する必要があります。

Android 4.0.3(API バージョン 15)以降でこの問題を回避するには、 インテントのデータキー finishActivityOnSaveCompleted(値は true)。 Android 4.0 より前の Android バージョンもこのキーを受け入れますが、効果はありません。次のように 拡張データを使用するには、次の操作を行います。

Kotlin

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

Java

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

他の拡張データを追加する

Intent に拡張データを追加するには、必要に応じて putExtra() を呼び出します。拡張データを連絡帳の一般的なフィールドに追加することができます。Intents.Insert 内で指定した Key-Value を使用して、なお、 ContactsContract.Contacts テーブルの列は変更できません。 これらの列は、クラスの API リファレンスのサマリー セクションにリストされています。 [更新] の [ContactsContract.Contacts] をクリックします。

インテントを送信する

最後に、作成したインテントを送信します。次に例を示します。

Kotlin

    // Sends the Intent
    startActivity(editIntent)

Java

    // Sends the Intent
    startActivity(editIntent);

インテントを使用して、挿入と編集のいずれを行うのかユーザーが選択できるようにする

ユーザーが連絡先を挿入するか、既存の連絡先を編集するかを選択できるように、 アクションを含む Intent ACTION_INSERT_OR_EDIT。たとえば、メール クライアント アプリは 受信メールを新しい連絡先に追加したり、連絡先リストとして メールアドレスを入力します。このインテントは、MIME タイプを Contacts.CONTENT_ITEM_TYPE に設定します。データ URI は設定しません。

このインテントを送信すると、連絡先アプリに連絡先のリストが表示されます。ユーザーは、新しい連絡先を挿入するか、既存の連絡先を選択して編集することができます。 インテントに追加した拡張データ フィールドが、表示される画面に示されます。Intents.Insert 内で指定した任意の Key-Value を使用できます。インテントを作成して送信する方法を次のコード スニペットに示します。

Kotlin

    // Creates a new Intent to insert or edit a contact
    val intentInsertEdit = Intent(Intent.ACTION_INSERT_OR_EDIT).apply {
        // Sets the MIME type
        type = ContactsContract.Contacts.CONTENT_ITEM_TYPE
    }
    // Add code here to insert extended data, if desired

    // Sends the Intent with an request ID
    startActivity(intentInsertEdit)

Java

    // 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(ContactsContract.Contacts.CONTENT_ITEM_TYPE);
    // Add code here to insert extended data, if desired
    ...
    // Sends the Intent with an request ID
    startActivity(intentInsertEdit);