مدیریت مکان‌های ذخیره‌سازی مخاطبین

برنامه‌ها ممکن است به کاربران اجازه دهند مخاطب ایجاد و ذخیره کنند. این مخاطبین معمولاً می‌توانند در دو مکان ذخیره شوند:

  1. حساب ابری: مخاطبین را در حسابی که با سرویس ابری (مثل Google Cloud) مرتبط است ذخیره کنید تا امکان همگام‌سازی و پشتیبان‌گیری از مخاطبین فراهم شود.
  2. حساب محلی: مخاطبین را می‌توان به‌صورت محلی در دستگاه ذخیره کرد.

کاربران می‌توانند مکان ذخیره‌سازی ترجیحی خود را در تنظیمات دستگاه تنظیم کنند. این مکان ترجیحی به‌عنوان حساب پیش‌فرض شناخته می‌شود و هنگام ایجاد مخاطبین استفاده می‌شود. برنامه‌ها باید این اولویت را رعایت کنند. این سند توضیح می‌دهد چگونه با مکان‌های مختلف ذخیره‌سازی مخاطبین، ازجمله حساب‌های ابری و حساب‌های محلی، کار کنید و روال‌های مطلوب را برای مدیریت اولویت‌های کاربر پیاده‌سازی کنید. حساب محلی به ذخیره کردن مخاطبین مستقیماً در دستگاه اشاره دارد.

بازیابی حساب پیش‌فرض

برای تعیین حساب پیش‌فرض برای مخاطبین جدید، از ContactsContract.RawContacts.DefaultAccount استفاده کنید

برای دریافت شیء ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState، با getDefaultAccountForNewContacts() تماس بگیرید. این شیء حاوی اطلاعاتی درباره تنظیم حساب پیش‌فرض است.

کاتلین

import ContactsContrast.RawContacts
import ContactsContrast.RawContacts.DefaultAccount
import ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState

val defaultAccountAndState: DefaultAccountAndState =
  DefaultAccount.getDefaultAccountForNewContacts(
      getContentResolver()
  )

جاوا

import ContactsContrast.RawContacts;
import ContactsContrast.RawContacts.DefaultAccount;
import ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState;

DefaultAccountAndState defaultAccountAndState =
  DefaultAccount.getDefaultAccountForNewContacts(
    getContentResolver()
  );

شیء DefaultAccountAndState حاوی موارد زیر است:

  • وضعیت: نشان می‌دهد که آیا حساب پیش‌فرضی تنظیم شده است یا نه و اگر تنظیم شده باشد، دسته آن حساب (ابری، محلی، یا سیم‌کارت) را نشان می‌دهد.
  • حساب: جزئیات حساب خاص (نام و نوع) را ارائه می‌دهد اگر وضعیت DEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIM باشد. برای سایر وضعیت‌ها، ازجمله DEFAULT_ACCOUNT_STATE_LOCAL، مقدار آن تهی خواهد بود.

در اینجا مثالی از نحوه تجزیه شیء DefaultAccountAndState آورده شده است:

کاتلین

// 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 -> {
    }
}

جاوا

// 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;
}

ایجاد مخاطب بدون مشخص کردن حساب

اگر حساب پیش‌فرض تنظیم شده باشد، معمولاً برنامه‌تان نیازی ندارد هنگام ایجاد مخاطبین، حسابی را به‌طور صریح مشخص کند. سیستم به‌طور خودکار مخاطب جدید را در حساب پیش‌فرض ذخیره می‌کند. در اینجا نحوه ایجاد مخاطب بدون مشخص کردن حساب آورده شده است.

ArrayList جدیدی از اشیای ContentProviderOperation ایجاد کنید. این فهرست عملیات درج مخاطب خام و داده‌های مرتبط با آن را نگه می‌دارد.

کاتلین

val ops = ArrayList<ContentProviderOperation>()

جاوا

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

ContentProviderOperation جدیدی برای درج مخاطب خام ایجاد کنید. چون حسابی را مشخص نمی‌کنید، نیازی نیست ACCOUNT_TYPE و ACCOUNT_NAME را اضافه کنید.

کاتلین

val op = ContentProviderOperation.newInsert(
    ContactsContract.RawContacts.CONTENT_URI
)
ops.add(op.build())

جاوا

ContentProviderOperation.Builder op =
    ContentProviderOperation.newInsert(
        ContactsContract.RawContacts.CONTENT_URI
    );
ops.add(op.build());

اشیاء ContentProviderOperation دیگر را به فهرست عملیات اضافه کنید تا فیلدهای مخاطب (مانند نام، شماره تلفن، ایمیل) را دربرگیرد. سپس عملیات دسته‌ای را برای ایجاد مخاطب اجرا کنید.

کاتلین

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

جاوا

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

ایجاد مخاطب در حساب ابری

برای ایجاد مخاطب در حساب ابری، ردیف مخاطب خام را در جدول ContactsContract.RawContacts وارد کنید و حساب ابری را مشخص کنید. به این صورت:

ArrayList جدیدی از اشیای ContentProviderOperation ایجاد کنید.

کاتلین

val ops = ArrayList<ContentProviderOperation>()

جاوا

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

ContentProviderOperation جدیدی برای درج مخاطب خام ایجاد کنید. از روش withValue() برای مشخص کردن نوع حساب و نام حساب انتخاب‌شده ابری استفاده کنید.

کاتلین

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

جاوا

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 درج کنید و اطلاعات حساب را برای حساب محلی مشخص کنید:

ArrayList جدیدی از اشیای ContentProviderOperation ایجاد کنید.

کاتلین

val ops = ArrayList<ContentProviderOperation>()

جاوا

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

ContentProviderOperation جدیدی برای درج مخاطب خام ایجاد کنید. از ContactsContract.RawContacts.getLocalAccountName() و ContactsContract.RawContacts.getLocalAccountType() برای مشخص کردن اطلاعات حساب برای حساب محلی استفاده کنید.

کاتلین

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

جاوا

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 دیگر را به فهرست عملیات اضافه کنید تا فیلدهای مخاطب را دربرگیرد، و عملیات دسته‌ای را برای ایجاد مخاطب اجرا کنید.