アプリでは、ユーザーが連絡先を作成して保存できるようにする場合があります。通常、これらの連絡先は次の 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 リストに追加して連絡先フィールドを含め、バッチ オペレーションを実行して連絡先を作成します。