Quản lý vị trí lưu trữ danh bạ

Ứng dụng có thể cho phép người dùng tạo và lưu trữ danh bạ. Thông thường, bạn có thể lưu những người liên hệ này ở hai vị trí:

  1. Tài khoản đám mây: Lưu danh bạ vào một tài khoản liên kết với dịch vụ đám mây (chẳng hạn như Google Cloud) để cho phép đồng bộ hoá và sao lưu danh bạ.
  2. Tài khoản cục bộ: Danh bạ có thể được lưu trữ cục bộ trên thiết bị.

Người dùng có thể đặt vị trí lưu trữ ưu tiên trong phần cài đặt thiết bị. Vị trí ưu tiên này được gọi là tài khoản mặc định và được dùng khi bạn tạo danh bạ. Các ứng dụng phải tuân theo lựa chọn ưu tiên này. Tài liệu này giải thích cách sử dụng các vị trí lưu trữ danh bạ khác nhau, bao gồm cả tài khoản đám mây và tài khoản cục bộ, đồng thời triển khai các phương pháp hay nhất để quản lý lựa chọn ưu tiên của người dùng. Tài khoản cục bộ là tài khoản lưu trữ danh bạ trực tiếp trên thiết bị.

Truy xuất tài khoản mặc định

Để xác định tài khoản mặc định cho người liên hệ mới, hãy sử dụng biểu tượng ContactsContract.RawContacts.DefaultAccount

Gọi getDefaultAccountForNewContacts() để lấy đối tượng ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState. Đối tượng này chứa thông tin về chế độ cài đặt tài khoản mặc định.

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()
  );

Đối tượng DefaultAccountAndState chứa:

  • Trạng thái: Cho biết có tài khoản mặc định nào được đặt hay không và nếu có thì danh mục của tài khoản đó (đám mây, cục bộ hoặc SIM).
  • Tài khoản: Cung cấp thông tin cụ thể về tài khoản (tên và loại) nếu trạng thái là DEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIM. Giá trị này sẽ là null đối với các trạng thái khác, kể cả DEFAULT_ACCOUNT_STATE_LOCAL.

Sau đây là ví dụ về cách phân tích cú pháp đối tượng 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;
}

Tạo người liên hệ mà không cần chỉ định tài khoản

Nếu bạn đặt tài khoản mặc định, thì ứng dụng của bạn thường không cần chỉ định rõ ràng một tài khoản khi tạo danh bạ. Hệ thống sẽ tự động lưu người liên hệ mới vào tài khoản mặc định. Sau đây là cách tạo một người liên hệ mà không cần chỉ định tài khoản.

Tạo một ArrayList mới cho các đối tượng ContentProviderOperation. Danh sách này chứa các thao tác để chèn danh bạ thô và dữ liệu liên kết của danh bạ đó.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

ArrayList<ContentProviderOperation> ops =
        new ArrayList<ContentProviderOperation>();

Tạo một ContentProviderOperation mới để chèn người liên hệ thô. Vì không chỉ định tài khoản nên bạn không cần thêm 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());

Thêm các đối tượng ContentProviderOperation khác vào danh sách ops để thêm các trường liên hệ (chẳng hạn như tên, số điện thoại, email). Sau đó, hãy thực thi thao tác hàng loạt để tạo người liên hệ.

Kotlin

try {
    getContentResolver().applyBatch(
        ContactsContract.AUTHORITY, ops
    )
} catch (e: Exception) {
    // Handle exceptions
}

Java

try {
    getContentResolver().applyBatch(
        ContactsContract.AUTHORITY, ops
    );
} catch (Exception e) {
    // Handle exceptions
}

Tạo người liên hệ trong tài khoản đám mây

Để tạo một người liên hệ trong tài khoản đám mây, hãy chèn hàng người liên hệ thô vào bảng ContactsContract.RawContacts và chỉ định tài khoản đám mây. Dưới đây là cách thực hiện:

Tạo một ArrayList mới cho các đối tượng ContentProviderOperation.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

ArrayList<ContentProviderOperation> ops =
    new ArrayList<ContentProviderOperation>();

Tạo một ContentProviderOperation mới để chèn người liên hệ thô. Sử dụng phương thức withValue() để chỉ định loại tài khoản và tên tài khoản của tài khoản đám mây đã chọn.

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());

Thêm các đối tượng ContentProviderOperation khác vào danh sách thao tác để thêm các trường liên hệ và thực thi thao tác hàng loạt để tạo người liên hệ.

Tạo người liên hệ trong tài khoản cục bộ

Để tạo một người liên hệ trong tài khoản cục bộ, hãy chèn một hàng người liên hệ thô mới vào bảng ContactsContract.RawContacts và chỉ định thông tin tài khoản cho tài khoản cục bộ:

Tạo một ArrayList mới cho các đối tượng ContentProviderOperation.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

ArrayList<ContentProviderOperation> ops =
    new ArrayList<ContentProviderOperation>();

Tạo một ContentProviderOperation mới để chèn người liên hệ thô. Sử dụng ContactsContract.RawContacts.getLocalAccountName()ContactsContract.RawContacts.getLocalAccountType() để chỉ định thông tin tài khoản cho tài khoản cục bộ.

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());

Thêm các đối tượng ContentProviderOperation khác vào danh sách ops để thêm các trường liên hệ và thực thi các thao tác hàng loạt để tạo người liên hệ.