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

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

  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 این مقدار null خواهد بود.

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