연락처 저장소 위치 관리

앱에서 사용자가 연락처를 만들고 저장하도록 허용할 수 있습니다. 이러한 연락처는 일반적으로 두 위치에 저장할 수 있습니다.

  1. 클라우드 계정: 클라우드 서비스 (예: Google Cloud)와 연결된 계정에 연락처를 저장하여 연락처 동기화 및 백업을 허용합니다.
  2. 로컬 계정: 연락처를 기기에 로컬로 저장할 수 있습니다.

사용자는 기기 설정에서 원하는 저장소 위치를 설정할 수 있습니다. 이 기본 위치를 기본 계정이라고 하며 연락처를 만들 때 사용됩니다. 앱은 이 환경설정을 준수해야 합니다. 이 문서에서는 클라우드 계정 및 로컬 계정을 비롯한 다양한 연락처 저장소 위치를 사용하는 방법과 사용자 환경설정을 관리하기 위한 권장사항을 구현하는 방법을 설명합니다. 로컬 계정은 기기에 연락처를 직접 저장하는 것을 의미합니다.

기본 계정 검색

새 연락처의 기본 계정을 확인하려면 ContactsContract.RawContacts.DefaultAccount를 사용합니다.

getDefaultAccountForNewContacts()를 호출하여 ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState 객체를 가져옵니다. 이 객체에는 기본 계정 설정에 관한 정보가 포함됩니다.

Kotlin

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 객체에는 다음이 포함됩니다.

  • 상태: 기본 계정이 설정되어 있는지 여부와 설정된 경우 계정의 카테고리 (클라우드, 로컬, SIM)를 나타냅니다.
  • 계정: 상태가 DEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIM인 경우 특정 계정 세부정보 (이름 및 유형)를 제공합니다. DEFAULT_ACCOUNT_STATE_LOCAL를 비롯한 다른 상태에서는 null입니다.

다음은 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 -> {
    }
}

자바

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

계정을 지정하지 않고 연락처 만들기

기본 계정이 설정된 경우 일반적으로 앱은 연락처를 만들 때 계정을 명시적으로 지정할 필요가 없습니다. 시스템에서 새 연락처를 기본 계정에 자동으로 저장합니다. 계정을 지정하지 않고 연락처를 만드는 방법은 다음과 같습니다.

ContentProviderOperation 객체의 새 ArrayList를 만듭니다. 이 목록에는 원시 연락처 및 관련 데이터를 삽입하는 작업이 포함됩니다.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

자바

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

ContentProviderOperation를 만들어 원시 연락처를 삽입합니다. 계정을 지정하지 않으므로 ACCOUNT_TYPEACCOUNT_NAME를 포함하지 않아도 됩니다.

Kotlin

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 객체를 추가합니다. 그런 다음 일괄 작업을 실행하여 연락처를 만듭니다.

Kotlin

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

자바

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

클라우드 계정에서 연락처 만들기

클라우드 계정에서 연락처를 만들려면 원시 연락처 행을 ContactsContract.RawContacts 테이블에 삽입하고 클라우드 계정을 지정합니다. 방법은 다음과 같습니다.

ContentProviderOperation 객체의 새 ArrayList를 만듭니다.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

자바

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

ContentProviderOperation를 만들어 원시 연락처를 삽입합니다. withValue() 메서드를 사용하여 선택한 클라우드 계정의 계정 유형과 계정 이름을 지정합니다.

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

자바

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 테이블에 새 원시 연락처 행을 삽입하고 로컬 계정의 계정 정보를 지정합니다.

ContentProviderOperation 객체의 새 ArrayList를 만듭니다.

Kotlin

val ops = ArrayList<ContentProviderOperation>()

자바

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

ContentProviderOperation를 만들어 원시 연락처를 삽입합니다. ContactsContract.RawContacts.getLocalAccountName()ContactsContract.RawContacts.getLocalAccountType()를 사용하여 로컬 계정의 계정 정보를 지정합니다.

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

자바

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 객체를 추가하고 일괄 작업을 실행하여 연락처를 만듭니다.