Le app possono consentire agli utenti di creare e archiviare 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 posizione preferita è nota come account predefinito e viene utilizzata quando si creano i contatti. Le app devono rispettare questa preferenza. Questo documento spiega come utilizzare le diverse posizioni di archiviazione dei contatti, inclusi gli account cloud e gli account locali, e implementare le best practice per la gestione delle preferenze utente. 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 il
ContactsContract.RawContacts.DefaultAccount
Chiama getDefaultAccountForNewContacts() per ottenere l'
ContactsContrast.RawContacts.DefaultAccount.DefaultAccountAndState
oggetto. Questo oggetto contiene informazioni sull'impostazione dell'account predefinito.
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 quell'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à null per 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 è impostato l'account predefinito, in genere l'app non deve specificare esplicitamente un account quando crea i 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 stai specificando un account, non devi 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 (ad esempio 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 le informazioni 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.