Mengelola lokasi penyimpanan kontak

Aplikasi dapat mengizinkan pengguna membuat dan menyimpan kontak. Kontak ini biasanya dapat disimpan di dua lokasi:

  1. Akun cloud: Menyimpan kontak ke akun yang terkait dengan layanan cloud (seperti Google Cloud) untuk memungkinkan sinkronisasi dan pencadangan kontak.
  2. Akun lokal: Kontak dapat disimpan secara lokal di perangkat.

Pengguna dapat menetapkan lokasi penyimpanan yang diinginkan di setelan perangkat. Lokasi pilihan ini dikenal sebagai akun default, dan digunakan saat membuat kontak. Aplikasi harus mematuhi preferensi ini. Dokumen ini menjelaskan cara menggunakan berbagai lokasi penyimpanan kontak, termasuk akun cloud dan akun lokal, serta menerapkan praktik terbaik untuk mengelola preferensi pengguna. Akun lokal mengacu pada penyimpanan kontak langsung di perangkat.

Mengambil akun default

Untuk menentukan akun default untuk kontak baru, gunakan ContactsContract.RawContacts.DefaultAccount

Panggil getDefaultAccountForNewContacts() untuk mendapatkan objek ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState. Objek ini berisi informasi tentang setelan akun default.

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

Objek DefaultAccountAndState berisi:

  • Status: Menunjukkan apakah akun default ditetapkan dan, jika ya, kategori akun tersebut (cloud, lokal, atau SIM).
  • Account: Memberikan detail akun tertentu (nama dan jenis) jika statusnya adalah DEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIM. Nilai ini akan null untuk status lain, termasuk DEFAULT_ACCOUNT_STATE_LOCAL.

Berikut adalah contoh cara mengurai objek 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;
}

Membuat kontak tanpa menentukan akun

Jika akun default ditetapkan, aplikasi Anda biasanya tidak perlu menentukan akun secara eksplisit saat membuat kontak. Sistem akan otomatis menyimpan kontak baru ke akun default. Berikut adalah cara membuat kontak tanpa menentukan akun.

Buat ArrayList baru dari objek ContentProviderOperation. Daftar ini menyimpan operasi untuk menyisipkan kontak mentah dan data terkaitnya.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

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

Buat ContentProviderOperation baru untuk menyisipkan kontak mentah. Karena Anda tidak menentukan akun, Anda tidak perlu menyertakan ACCOUNT_TYPE dan 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());

Tambahkan objek ContentProviderOperation lainnya ke daftar operasi untuk menyertakan kolom kontak (seperti nama, nomor telepon, email). Kemudian, jalankan operasi batch untuk membuat kontak.

Kotlin

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

Java

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

Membuat kontak di akun cloud

Untuk membuat kontak di akun cloud, masukkan baris kontak mentah ke dalam tabel ContactsContract.RawContacts dan tentukan akun cloud. Berikut caranya:

Buat ArrayList baru dari objek ContentProviderOperation.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

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

Buat ContentProviderOperation baru untuk menyisipkan kontak mentah. Gunakan metode withValue() untuk menentukan jenis akun dan nama akun akun cloud yang dipilih.

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

Tambahkan objek ContentProviderOperation lainnya ke daftar operasi untuk menyertakan kolom kontak dan menjalankan operasi batch untuk membuat kontak.

Membuat kontak di akun lokal

Untuk membuat kontak di akun lokal, masukkan baris kontak mentah baru ke dalam tabel ContactsContract.RawContacts dan tentukan informasi akun untuk akun lokal:

Buat ArrayList baru dari objek ContentProviderOperation.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

Java

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

Buat ContentProviderOperation baru untuk menyisipkan kontak mentah. Gunakan ContactsContract.RawContacts.getLocalAccountName() dan ContactsContract.RawContacts.getLocalAccountType() untuk menentukan informasi akun untuk akun lokal.

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

Tambahkan objek ContentProviderOperation lainnya ke daftar operasi untuk menyertakan kolom kontak, dan jalankan operasi batch untuk membuat kontak.