Je veux permettre à l'utilisateur de me fournir son adresse électronique sans la taper. Idéalement, il y aurait un champ de texte dans lequel l'utilisateur pourrait taper une adresse électronique ou appuyer sur un bouton pour le remplir automatiquement.
Dans une question précédente, Roman Nurik suggère d'utiliser un AccountManager pour gérer cela, mais cela nécessite que mon application utilise le privilège GET_ACCOUNTS; mon application pouvait alors accéder à tous les comptes d'utilisateurs sur l'appareil, y compris leurs comptes Facebook/Twitter. Cette permission semble trop large pour ce que je veux.
Existe-t-il un moyen plus agréable de gérer cela sans qu'il soit nécessaire d'accorder une permission aussi lourde à mon application?
Je sais que je suis trop tard, mais cela pourrait être utile aux autres.
Je pense que la meilleure façon de renseigner automatiquement un champ de courrier électronique est d'utiliser AccountPicker
Si votre application dispose de l'autorisation GET_ACCOUNTS et qu'il n'y a qu'un seul compte, vous l'obtenez immédiatement. Si votre application ne l'a pas ou s'il y a plus d'un compte, les utilisateurs reçoivent une invite afin d'autoriser ou non l'action.
Votre application doit inclure les Services Google Play , mais elle ne nécessite aucune autorisation.
Tout ce processus échouera sur les anciennes versions d'Android (2.2+ est requis), ou si Google Play n'est pas disponible, vous devez donc considérer ce cas.
Voici un exemple de code de base:
private static final int REQUEST_CODE_EMAIL = 1;
private TextView email = (TextView) findViewById(R.id.email);
// ...
try {
Intent intent = AccountPicker.newChooseAccountIntent(null, null,
new String[] { GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE }, false, null, null, null, null);
startActivityForResult(intent, REQUEST_CODE_EMAIL);
} catch (ActivityNotFoundException e) {
// TODO
}
// ...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_EMAIL && resultCode == RESULT_OK) {
String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
email.setText(accountName);
}
}
En effet, non seulement vous ne pouvez pas le faire sans GET_ACCOUNTS, mais les informations souhaitées n'existent que dans les données du compte de l'utilisateur (Google).
Sur mon téléphone Sprint, l'adresse de propriétaire affectée par le sprint est [email protected]
, et elle est visible à l'aide de getprop
à partir d'un shell. Mais ce n’est pas mon adresse électronique principale, ni même celle que j’utilise/vérifie. Ce que vous voulez est mon adresse Gmail, qui est stockée dans les données du compte Android.
En fait, vous voulez un des deux, ce qui est une autre raison pour laquelle vous avez besoin de GET_ACCOUNTS. Si vous demandez mon adresse e-mail, vous devez me laisser choisir l'un des deux comptes @ gmail.com configurés sur l'appareil. I savoir lequel est mon préféré (bien que ce soit même contextuel), mais AFAIK n'est pas considéré par le système comme plus primaire ou par défaut que l'autre.
Une autre solution consiste à rechercher le nom d'utilisateur Google associé au périphérique, à partir duquel vous pouvez reconstruire une adresse [email protected]
, tout en nécessitant l'utilisation de AccountManager. Voir Accès à l'ID de compte Google/nom d'utilisateur via Android .