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 vào hai vị trí:

  1. Tài khoản trên đám mây: Lưu danh bạ vào một tài khoản được liên kết với một dịch vụ trên đá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ữ 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ị. Địa điểm ưu tiên này được gọi là tài khoản mặc định và được dùng khi tạo danh bạ. Các ứng dụng phải tuân thủ lựa chọn ưu tiên này. Tài liệu này giải thích cách làm việc với nhiều vị trí lưu trữ thông tin liên hệ, bao gồm cả tài khoản trê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ộ đề cập đến việc 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 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 liệu bạn đã đặt tài khoản mặc định hay chưa 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 chi tiết 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ẽ rỗng đối với các trạng thái khác, bao gồm 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õ 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 của các đối tượng ContentProviderOperation. Danh sách này chứa các thao tác để chèn thông tin liên hệ thô và dữ liệu liên quan.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

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

Tạo một ContentProviderOperation mới để chèn thông tin 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 để bao gồm các trường liên hệ (như tên, số điện thoại, email). Sau đó, hãy thực thi thao tác hàng loạt để tạo thông tin 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 trên đám mây

Để tạo một người liên hệ trong tài khoản trê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 trên đám mây. Dưới đây là cách thực hiện:

Tạo một ArrayList mới của 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 thông tin 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 để đưa các trường liên hệ vào 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 của 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 thông tin 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 thao tác để 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ệ.