管理聯絡人儲存位置

應用程式可能會允許使用者建立及儲存聯絡人。這些聯絡人通常可以儲存在兩個位置:

  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) 則為空值。

以下範例說明如何剖析 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 物件新增至作業清單,以納入聯絡人欄位 (例如姓名、電話號碼、電子郵件地址)。然後執行批次作業,建立聯絡人。

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 物件新增至作業清單,加入聯絡人欄位,並執行批次作業來建立聯絡人。

在當地帳戶中建立聯絡人

如要在本機帳戶中建立聯絡人,請將新的原始聯絡人資料列插入 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 物件新增至作業清單,以納入聯絡人欄位,並執行批次作業來建立聯絡人。