Есть несколько способов сделать это, показанные ниже.
В качестве дружеского предупреждения будьте внимательны и откровенны с пользователем при работе с учетной записью, профилем и контактными данными. Если вы неправильно используете адрес электронной почты пользователя или другую личную информацию, могут произойти плохие вещи.
Способ А. Использование AccountManager (уровень API 5+)
Вы можете использовать AccountManager.getAccounts
или, AccountManager.getAccountsByType
чтобы получить список всех имен учетных записей на устройстве. К счастью, для определенных типов учетных записей (в том числе com.google
), имена учетных записей являются адресами электронной почты. Пример фрагмента ниже.
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;
...
}
}
Обратите внимание, что для этого требуется GET_ACCOUNTS
разрешение:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Подробнее об использовании AccountManager
можно найти в образце кода Contact Manager в SDK.
Начиная с Android 4.0 (Ice Cream Sandwich), вы можете получить адреса электронной почты пользователя, зайдя в его профиль. Доступ к профилю пользователя немного тяжеловесен, поскольку требует двух разрешений (подробнее об этом ниже), но адреса электронной почты являются довольно конфиденциальными данными, поэтому это цена входного билета.
Ниже приведен полный пример, который использует CursorLoader
для получения строк данных профиля, содержащих адреса электронной почты.
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;
}
}
Это требует как READ_PROFILE
и READ_CONTACTS
разрешения:
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />