Las apps pueden permitir que los usuarios creen y almacenen contactos. Por lo general, estos contactos se pueden guardar en dos ubicaciones:
- Cuenta en la nube: Guarda los contactos en una cuenta asociada con un servicio en la nube (como Google Cloud) para permitir la sincronización y la creación de copias de seguridad de los contactos.
- Cuenta local: Los contactos se pueden almacenar de forma local en el dispositivo.
Los usuarios pueden establecer su ubicación de almacenamiento preferida en la configuración del dispositivo. Esta ubicación preferida se conoce como la cuenta predeterminada y se usa cuando se crean contactos. Las apps deben respetar esta preferencia. En este documento, se explica cómo trabajar con diferentes ubicaciones de almacenamiento de contactos, incluidas las cuentas en la nube y las cuentas locales, y se implementan prácticas recomendadas para administrar las preferencias del usuario. La cuenta local se refiere al almacenamiento de contactos directamente en el dispositivo.
Cómo recuperar la cuenta predeterminada
Para determinar la cuenta predeterminada para los contactos nuevos, usa ContactsContract.RawContacts.DefaultAccount
.
Llama a getDefaultAccountForNewContacts()
para obtener el objeto ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState
. Este objeto contiene información sobre la configuración predeterminada de la cuenta.
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()
);
El objeto DefaultAccountAndState
contiene lo siguiente:
- Estado: Indica si se configuró una cuenta predeterminada y, de ser así, la categoría de esta cuenta (nube, local o SIM).
- Account: Proporciona los detalles específicos de la cuenta (nombre y tipo) si el estado es
DEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIM
. Será nulo para otros estados, incluidoDEFAULT_ACCOUNT_STATE_LOCAL
.
Este es un ejemplo de cómo analizar el objeto 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;
}
Cómo crear contactos sin especificar una cuenta
Si se establece la cuenta predeterminada, por lo general, tu app no necesita especificar una cuenta de forma explícita cuando creas contactos. El sistema guarda automáticamente el contacto nuevo en la cuenta predeterminada. A continuación, te indicamos cómo crear un contacto sin especificar una cuenta.
Crea un ArrayList
nuevo de objetos ContentProviderOperation
. Esta lista contiene las operaciones para insertar el contacto sin procesar y sus datos asociados.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Crea un ContentProviderOperation
nuevo para insertar el contacto sin procesar. Como no especificas una cuenta, no es necesario que incluyas ACCOUNT_TYPE
ni 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());
Agrega otros objetos ContentProviderOperation
a la lista de operaciones para incluir los campos de contacto (como el nombre, el número de teléfono y el correo electrónico). Luego, ejecuta la operación
en lote para crear el contacto.
Kotlin
try {
getContentResolver().applyBatch(
ContactsContract.AUTHORITY, ops
)
} catch (e: Exception) {
// Handle exceptions
}
Java
try {
getContentResolver().applyBatch(
ContactsContract.AUTHORITY, ops
);
} catch (Exception e) {
// Handle exceptions
}
Crea contactos en una cuenta en la nube
Para crear un contacto en una cuenta de Cloud, inserta la fila de contacto sin procesar en la tabla ContactsContract.RawContacts
y especifica la cuenta de Cloud. A continuación, te indicamos cómo hacerlo:
Crea un ArrayList
nuevo de objetos ContentProviderOperation
.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Crea un ContentProviderOperation
nuevo para insertar el contacto sin procesar. Usa el
método withValue()
para especificar el tipo de cuenta y el nombre de la
cuenta en la nube seleccionada.
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());
Agrega otros objetos ContentProviderOperation
a la lista de operaciones para incluir los campos de contacto y ejecuta la operación por lotes para crear el contacto.
Crea contactos en la cuenta local
Para crear un contacto en la cuenta local, inserta una nueva fila de contacto sin procesar en la tabla ContactsContract.RawContacts
y especifica la información de la cuenta local:
Crea un ArrayList
nuevo de objetos ContentProviderOperation
.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Crea un ContentProviderOperation
nuevo para insertar el contacto sin procesar. Usa ContactsContract.RawContacts.getLocalAccountName()
y ContactsContract.RawContacts.getLocalAccountType()
para especificar la información de la cuenta local.
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());
Agrega otros objetos ContentProviderOperation
a la lista de operaciones para incluir los campos de contacto y ejecuta las operaciones por lotes para crear el contacto.