Le app possono consentire agli utenti di creare e memorizzare contatti. In genere, questi contatti possono 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 archiviati localmente sul dispositivo.
Gli utenti possono impostare la posizione di archiviazione preferita nelle impostazioni del dispositivo. Questa località preferita è nota come account predefinito e viene utilizzata per creare i contatti. Le app devono rispettare questa preferenza. Questo documento spiega come gestire diversi luoghi di archiviazione dei contatti, inclusi gli account cloud e gli account locali, e come implementare le best practice per la gestione delle preferenze degli utenti. L'account locale si riferisce alla memorizzazione 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 questo caso, la relativa categoria (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 la tua 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 di operazioni per includere i campi di contatto (ad esempio nome, numero di telefono, email). Quindi, esegui l'operazione di gruppo 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 tabellaContactsContract.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 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 di operazioni per includere i campi del contatto ed esegui l'operazione collettiva 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 tabellaContactsContract.RawContacts
e specifica i dati 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 le informazioni dell'account per l'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 di operazioni per includere i campi del contatto ed esegui le operazioni collettive per creare il contatto.