このレッスンでは、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_URI
と Contacts.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);