アプリでは、ユーザーが連絡先を作成して保存できる場合があります。通常、これらの連絡先は次の 2 つの場所に保存できます。
- クラウド アカウント: クラウド サービス(Google Cloud など)に関連付けられたアカウントに連絡先を保存して、連絡先の同期とバックアップを可能にします。
- ローカル アカウント: 連絡先をデバイスにローカルに保存できます。
ユーザーは、デバイスの設定で優先する保存場所を設定できます。この優先される場所はデフォルトのアカウントと呼ばれ、連絡先の作成時に使用されます。アプリはこの設定を尊重する必要があります。このドキュメントでは、クラウド アカウントやローカル アカウントなど、さまざまな連絡先の保存場所を扱う方法と、ユーザー設定を管理するためのベスト プラクティスを実装する方法について説明します。ローカル アカウントとは、連絡先をデバイスに直接保存することを指します。
デフォルトのアカウントを取得する
新しい連絡先のデフォルト アカウントを特定するには、ContactsContract.RawContacts.DefaultAccount
を使用します。
getDefaultAccountForNewContacts()
を呼び出して、ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState
オブジェクトを取得します。このオブジェクトには、デフォルトのアカウント設定に関する情報が含まれます。
Kotlin
import ContactsContrast.RawContacts
import ContactsContrast.RawContacts.DefaultAccount
import ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState
val defaultAccountAndState: DefaultAccountAndState =
DefaultAccount.getDefaultAccountForNewContacts(
getContentResolver()
)
Java
import ContactsContrast.RawContacts;
import ContactsContrast.RawContacts.DefaultAccount;
import ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState;
DefaultAccountAndState defaultAccountAndState =
DefaultAccount.getDefaultAccountForNewContacts(
getContentResolver()
);
DefaultAccountAndState
オブジェクトには次のものが含まれます。
- 状態: デフォルトのアカウントが設定されているかどうかを示します。設定されている場合は、そのアカウントのカテゴリ(クラウド、ローカル、SIM)を示します。
- アカウント: 状態が
DEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIM
の場合、特定のアカウントの詳細(名前とタイプ)を提供します。DEFAULT_ACCOUNT_STATE_LOCAL
を含む他の状態では null になります。
DefaultAccountAndState
オブジェクトを解析する方法の例を次に示します。
Kotlin
// Retrieves the state of default account.
val defaultAccountState = defaultAccountAndState.state
var defaultAccountName: String? = null
var defaultAccountType: String? = null
when (defaultAccountState) {
// Default account is set to a cloud or a SIM account.
DefaultAccountState.DEFAULT_ACCOUNT_STATE_CLOUD,
DefaultAccountState.DEFAULT_ACCOUNT_STATE_SIM -> {
defaultAccountName = defaultAccountAndState.account?.name
defaultAccountType = defaultAccountAndState.account?.type
}
// Default account is set to the local account on the device.
DefaultAccountState.DEFAULT_ACCOUNT_STATE_LOCAL -> {
defaultAccountName = RawContacts.getLocalAccountType()
defaultAccountType = RawContacts.getLocalAccountName()
}
// Default account is not set.
DefaultAccountState.DEFAULT_ACCOUNT_STATE_NOT_SET -> {
}
}
Java
// Retrieves the state of default account.
var defaultAccountState = defaultAccountAndState.getState();
String defaultAccountName = null;
String defaultAccountType = null;
switch (defaultAccountState) {
// Default account is set to a cloud or a SIM account.
case DefaultAccountState.DEFAULT_ACCOUNT_STATE_CLOUD:
case DefaultAccountState.DEFAULT_ACCOUNT_STATE_SIM:
defaultAccountName = defaultAccountAndState.getAccount().name;
defaultAccountType = defaultAccountAndState.getAccount().type;
break;
// Default account is set to the local account on the device.
case DefaultAccountState.DEFAULT_ACCOUNT_STATE_LOCAL:
defaultAccountName = RawContacts.getLocalAccountType();
defaultAccountType = RawContacts.getLocalAccountName();
break;
// Default account is not set.
case DefaultAccountState.DEFAULT_ACCOUNT_STATE_NOT_SET:
break;
}
アカウントを指定せずに連絡先を作成する
デフォルトのアカウントが設定されている場合、通常、アプリは連絡先を作成するときにアカウントを明示的に指定する必要はありません。新しい連絡先は、デフォルトのアカウントに自動的に保存されます。アカウントを指定せずに連絡先を作成する方法は次のとおりです。
ContentProviderOperation
オブジェクトの新しい ArrayList
を作成します。このリストには、連絡先とその関連データを挿入するオペレーションが保持されます。
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
新しい ContentProviderOperation
を作成して、未加工の連絡先を挿入します。アカウントを指定しないため、ACCOUNT_TYPE
と ACCOUNT_NAME
を含める必要はありません。
Kotlin
val op = ContentProviderOperation.newInsert(
ContactsContract.RawContacts.CONTENT_URI
)
ops.add(op.build())
Java
ContentProviderOperation.Builder op =
ContentProviderOperation.newInsert(
ContactsContract.RawContacts.CONTENT_URI
);
ops.add(op.build());
連絡先フィールド(名前、電話番号、メールアドレスなど)を含めるには、他の ContentProviderOperation
オブジェクトを ops リストに追加します。次に、バッチ オペレーションを実行して連絡先を作成します。
Kotlin
try {
getContentResolver().applyBatch(
ContactsContract.AUTHORITY, ops
)
} catch (e: Exception) {
// Handle exceptions
}
Java
try {
getContentResolver().applyBatch(
ContactsContract.AUTHORITY, ops
);
} catch (Exception e) {
// Handle exceptions
}
クラウド アカウントに連絡先を作成する
クラウド アカウントに連絡先を作成するには、ContactsContract.RawContacts
テーブルに未加工の連絡先行を挿入し、クラウド アカウントを指定します。手順は次のとおりです。
ContentProviderOperation
オブジェクトの新しい ArrayList
を作成します。
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
新しい ContentProviderOperation
を作成して、未加工の連絡先を挿入します。withValue()
メソッドを使用して、選択したクラウド アカウントのアカウント タイプとアカウント名を指定します。
Kotlin
val op = ContentProviderOperation.newInsert(
ContactsContract.RawContacts.CONTENT_URI
)
.withValue(
ContactsContract.RawContacts.ACCOUNT_TYPE,
selectedAccount.type
)
.withValue(
ContactsContract.RawContacts.ACCOUNT_NAME,
selectedAccount.name
)
ops.add(op.build())
Java
ContentProviderOperation.Builder op =
ContentProviderOperation.newInsert(
ContactsContract.RawContacts.CONTENT_URI
)
.withValue(
ContactsContract.RawContacts.ACCOUNT_TYPE,
selectedAccount.getType()
)
.withValue(
ContactsContract.RawContacts.ACCOUNT_NAME,
selectedAccount.getName()
);
ops.add(op.build());
連絡先フィールドを含めて連絡先を作成するバッチ オペレーションを実行するには、他の ContentProviderOperation
オブジェクトを ops リストに追加します。
ローカル アカウントに連絡先を作成する
ローカル アカウントに連絡先を作成するには、新しい未加工の連絡先行を ContactsContract.RawContacts
テーブルに挿入し、ローカル アカウントのアカウント情報を指定します。
ContentProviderOperation
オブジェクトの新しい ArrayList
を作成します。
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
新しい ContentProviderOperation
を作成して、未加工の連絡先を挿入します。ContactsContract.RawContacts.getLocalAccountName()
と ContactsContract.RawContacts.getLocalAccountType()
を使用して、ローカル アカウントのアカウント情報を指定します。
Kotlin
val op = ContentProviderOperation.newInsert(
ContactsContract.RawContacts.CONTENT_URI
)
.withValue(
ContactsContract.RawContacts.ACCOUNT_TYPE,
ContactsContract.RawContacts.getLocalAccountType()
)
.withValue(
ContactsContract.RawContacts.ACCOUNT_NAME,
ContactsContract.RawContacts.getLocalAccountName()
)
ops.add(op.build())
Java
ContentProviderOperation.Builder op =
ContentProviderOperation.newInsert(
ContactsContract.RawContacts.CONTENT_URI
)
.withValue(
ContactsContract.RawContacts.ACCOUNT_TYPE,
ContactsContract.RawContacts.getLocalAccountType()
)
.withValue(
ContactsContract.RawContacts.ACCOUNT_NAME,
ContactsContract.RawContacts.getLocalAccountName()
);
ops.add(op.build());
連絡先フィールドを含めるために、他の ContentProviderOperation
オブジェクトを ops リストに追加し、バッチ オペレーションを実行して連絡先を作成します。