Le app possono consentire agli utenti di creare e archiviare contatti. Questi contatti possono in genere essere salvati in due posizioni:
- Account cloud: salva i contatti in un account associato a un servizio cloud (ad esempio Google Cloud) per consentire la sincronizzazione e il backup dei contatti.
- Account locale: i contatti possono essere memorizzati localmente sul dispositivo.
Gli utenti possono impostare la posizione di archiviazione preferita nelle impostazioni del dispositivo. Questa posizione preferita è nota come account predefinito e viene utilizzata durante la creazione dei contatti. Le app devono rispettare questa preferenza. Questo documento spiega come utilizzare diverse posizioni di archiviazione dei contatti, inclusi gli account cloud e gli account locali, e implementare le best practice per la gestione delle preferenze degli utenti. L'account locale si riferisce all'archiviazione dei contatti direttamente sul dispositivo.
Recuperare l'account predefinito
Per determinare l'account predefinito per i nuovi contatti, utilizza
ContactsContract.RawContacts.DefaultAccount
Chiama getDefaultAccountForNewContacts()
per ottenere l'oggetto
ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState
. Questo oggetto contiene informazioni sull'impostazione predefinita dell'account.
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()
);
L'oggetto DefaultAccountAndState
contiene:
- Stato: indica se è impostato un account predefinito e, in caso affermativo, la categoria di questo account (cloud, locale o SIM).
- Account: fornisce i dettagli specifici dell'account (nome e tipo) se lo stato è
DEFAULT_ACCOUNT_STATE_CLOUD or DEFAULT_ACCOUNT_STATE_SIM
. Sarà nullo per gli altri stati, inclusoDEFAULT_ACCOUNT_STATE_LOCAL
.
Ecco un esempio di come analizzare l'oggetto 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;
}
Creare contatti senza specificare un account
Se l'account predefinito è impostato, in genere l'app non deve specificare esplicitamente un account durante la creazione dei contatti. Il sistema salva automaticamente il nuovo contatto nell'account predefinito. Ecco come creare un contatto senza specificare un account.
Crea un nuovo ArrayList
di oggetti ContentProviderOperation
. Questo elenco
contiene le operazioni per inserire il contatto non elaborato e i relativi dati associati.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Crea un nuovo ContentProviderOperation
per inserire il contatto non elaborato. Poiché non specifichi un account, non è necessario includere ACCOUNT_TYPE
e 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());
Aggiungi altri oggetti ContentProviderOperation
all'elenco delle operazioni per includere i campi
di contatto (come nome, numero di telefono, email). Quindi esegui l'operazione batch
per creare il contatto.
Kotlin
try {
getContentResolver().applyBatch(
ContactsContract.AUTHORITY, ops
)
} catch (e: Exception) {
// Handle exceptions
}
Java
try {
getContentResolver().applyBatch(
ContactsContract.AUTHORITY, ops
);
} catch (Exception e) {
// Handle exceptions
}
Creare contatti in un account cloud
Per creare un contatto in un account cloud, inserisci la riga del contatto non elaborato nella
tabella ContactsContract.RawContacts
e specifica l'account cloud. Ecco come:
Crea un nuovo ArrayList
di oggetti ContentProviderOperation
.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Crea un nuovo ContentProviderOperation
per inserire il contatto non elaborato. Utilizza il metodo
withValue()
per specificare il tipo di account e il nome dell'account cloud
selezionato.
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());
Aggiungi altri oggetti ContentProviderOperation
all'elenco delle operazioni per includere i campi di contatto ed esegui l'operazione batch per creare il contatto.
Creare contatti nell'account locale
Per creare un contatto nell'account locale, inserisci una nuova riga di contatto non elaborato nella
tabella ContactsContract.RawContacts
e specifica le informazioni dell'account
locale:
Crea un nuovo ArrayList
di oggetti ContentProviderOperation
.
Kotlin
val ops = ArrayList<ContentProviderOperation>()
Java
ArrayList<ContentProviderOperation> ops =
new ArrayList<ContentProviderOperation>();
Crea un nuovo ContentProviderOperation
per inserire il contatto non elaborato. Utilizza
ContactsContract.RawContacts.getLocalAccountName()
e
ContactsContract.RawContacts.getLocalAccountType()
per specificare i dati
dell'account locale.
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());
Aggiungi altri oggetti ContentProviderOperation
all'elenco delle operazioni per includere i campi di contatto ed esegui le operazioni batch per creare il contatto.