Il existe plusieurs façons de procéder, indiquées ci-dessous.
Comme avertissement amical, soyez prudent et direct envers l'utilisateur lorsqu'il traite des données de compte, de profil et de contact. Si vous abusez de l'adresse e-mail d'un utilisateur ou d'autres informations personnelles, de mauvaises choses peuvent se produire.
Méthode A: utiliser AccountManager (API niveau 5+)
Vous pouvez utiliser AccountManager.getAccounts
ou AccountManager.getAccountsByType
pour obtenir une liste de tous les noms de compte sur l'appareil. Heureusement, pour certains types de comptes (y compris com.google
), les noms de compte sont des adresses e-mail. Exemple d'extrait ci-dessous.
Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
Account[] accounts = AccountManager.get(context).getAccounts();
for (Account account : accounts) {
if (emailPattern.matcher(account.name).matches()) {
String possibleEmail = account.name;
...
}
}
Notez que cela nécessite l' GET_ACCOUNTS
autorisation:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Pour plus d'informations sur l'utilisation, AccountManager
consultez l' exemple de code Contact Manager dans le SDK.
Depuis Android 4.0 (Ice Cream Sandwich), vous pouvez obtenir les adresses e-mail de l'utilisateur en accédant à son profil. L'accès au profil utilisateur est un peu lourd car il nécessite deux autorisations (plus d'informations ci-dessous), mais les adresses e-mail sont des données assez sensibles, c'est donc le prix d'admission.
Voici un exemple complet qui utilise un CursorLoader
pour récupérer les lignes de données de profil contenant des adresses e-mail.
public class ExampleActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle arguments) {
return new CursorLoader(this,
// Retrieve data rows for the device user's 'profile' contact.
Uri.withAppendedPath(
ContactsContract.Profile.CONTENT_URI,
ContactsContract.Contacts.Data.CONTENT_DIRECTORY),
ProfileQuery.PROJECTION,
// Select only email addresses.
ContactsContract.Contacts.Data.MIMETYPE + " = ?",
new String[]{ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE},
// Show primary email addresses first. Note that there won't be
// a primary email address if the user hasn't specified one.
ContactsContract.Contacts.Data.IS_PRIMARY + " DESC");
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
List<String> emails = new ArrayList<String>();
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
emails.add(cursor.getString(ProfileQuery.ADDRESS));
// Potentially filter on ProfileQuery.IS_PRIMARY
cursor.moveToNext();
}
...
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
}
private interface ProfileQuery {
String[] PROJECTION = {
ContactsContract.CommonDataKinds.Email.ADDRESS,
ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
};
int ADDRESS = 0;
int IS_PRIMARY = 1;
}
}
Cela nécessite à la fois les autorisations READ_PROFILE
et READ_CONTACTS
:
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />