連絡先の保存場所を管理する

アプリでは、ユーザーが連絡先を作成して保存できるようにする場合があります。通常、これらの連絡先は次の 2 つの場所に保存できます。

  1. クラウド アカウント: クラウド サービス(Google Cloud など)に関連付けられたアカウントに連絡先を保存して、連絡先の同期とバックアップを可能にします。
  2. ローカル アカウント: 連絡先をデバイスにローカルに保存できます。

ユーザーは、デバイスの設定で保存先を設定できます。この優先される場所はデフォルト アカウントと呼ばれ、連絡先の作成時に使用されます。アプリは、この設定を尊重する必要があります。このドキュメントでは、クラウド アカウントやローカル アカウントなど、さまざまな連絡先ストレージ ロケーションを操作する方法と、ユーザー設定を管理するためのベスト プラクティスの実装方法について説明します。ローカル アカウントとは、連絡先をデバイスに直接保存することを指します。

デフォルト アカウントを取得する

新しい連絡先のデフォルト アカウントを特定するには、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_TYPEACCOUNT_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 リストに追加して連絡先フィールドを含め、バッチ オペレーションを実行して連絡先を作成します。