Как получить основной адрес электронной почты устройства Android

Как вы получаете основной адрес электронной почты Android (или список адресов электронной почты)?

Я понимаю, что в ОС 2.0+ есть поддержка нескольких адресов электронной почты, но ниже 2.0 вы можете иметь только один адрес электронной почты для каждого устройства.

Существует несколько способов сделать это, как показано ниже.

Как дружественное предупреждение, будьте осторожны и перед пользователем, когда имеете дело с учетной записью, профилем и контактными данными. Если вы неправильно используете адрес электронной почты пользователя или другую личную информацию, могут возникнуть плохие вещи.

Метод A. Используйте 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.

Метод B. Используйте ContactsContract.Profile (API-уровень 14+)

Начиная с 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" /> 

5/6/2012 – Добавлена ​​информация о доступе к профилю для Android 4.0+

Это может быть полезно для других:

Использование AccountPicker для получения адреса электронной почты пользователя без каких-либо глобальных разрешений и предоставления пользователю возможности знать и разрешать или отменять процесс.

Я бы использовал Android- аккаунт Android, представленный в ICS.

 Intent googlePicker = AccountPicker.newChooseAccountIntent(null, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null); startActivityForResult(googlePicker, REQUEST_CODE); 

А потом дождитесь результата:

 protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); } } 
 public String getUsername() { AccountManager manager = AccountManager.get(this); Account[] accounts = manager.getAccountsByType("com.google"); List<String> possibleEmails = new LinkedList<String>(); for (Account account : accounts) { // TODO: Check possibleEmail against an email regex or treat // account.name as an email address only for certain account.type values. possibleEmails.add(account.name); } if (!possibleEmails.isEmpty() && possibleEmails.get(0) != null) { String email = possibleEmails.get(0); String[] parts = email.split("@"); if (parts.length > 1) return parts[0]; } return null; } 

Это довольно сложная задача для Android, и я еще не сделал этого. Но, возможно, эти ссылки могут вам помочь:

  • Android-выпуск 1073: токены Google Auth должны быть доступны сторонним приложениям через API
  • SDK API AccountManager в Andriod 2.x +

Печально принятый ответ не работает.

Я опаздываю, но вот решение для внутреннего приложения электронной почты Android, если контент uri не будет изменен провайдером:

 Uri EMAIL_ACCOUNTS_DATABASE_CONTENT_URI = Uri.parse("content://com.android.email.provider/account"); public ArrayList<String> GET_EMAIL_ADDRESSES () { ArrayList<String> names = new ArrayList<String>(); ContentResolver cr = m_context.getContentResolver(); Cursor cursor = cr.query(EMAIL_ACCOUNTS_DATABASE_CONTENT_URI ,null, null, null, null); if (cursor == null) { Log.e("TEST", "Cannot access email accounts database"); return null; } if (cursor.getCount() <= 0) { Log.e("TEST", "No accounts"); return null; } while (cursor.moveToNext()) { names.add(cursor.getString(cursor.getColumnIndex("emailAddress"))); Log.i("TEST", cursor.getString(cursor.getColumnIndex("emailAddress"))); } return names; } 

Работа в операционной системе MarshMallow

  btn_click=(Button) findViewById(R.id.btn_click); btn_click.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int permissionCheck = ContextCompat.checkSelfPermission(PermissionActivity.this, android.Manifest.permission.CAMERA); if (permissionCheck == PackageManager.PERMISSION_GRANTED) { //showing dialog to select image String possibleEmail=null; Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+ Account[] accounts = AccountManager.get(PermissionActivity.this).getAccounts(); for (Account account : accounts) { if (emailPattern.matcher(account.name).matches()) { possibleEmail = account.name; Log.e("keshav","possibleEmail"+possibleEmail); } } Log.e("keshav","possibleEmail gjhh->"+possibleEmail); Log.e("permission", "granted Marshmallow O/S"); } else { ActivityCompat.requestPermissions(PermissionActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.READ_PHONE_STATE, Manifest.permission.GET_ACCOUNTS, android.Manifest.permission.CAMERA}, 1); } } else { 

// Понизьте Зефир

  String possibleEmail=null; Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+ Account[] accounts = AccountManager.get(PermissionActivity.this).getAccounts(); for (Account account : accounts) { if (emailPattern.matcher(account.name).matches()) { possibleEmail = account.name; Log.e("keshav","possibleEmail"+possibleEmail); } Log.e("keshav","possibleEmail gjhh->"+possibleEmail); } } }); 
Intereting Posts
Android: есть произвольный просмотр слайда под другим представлением, как и клавиатура программного обеспечения Обновить текст уведомления, а не целое уведомление Как проверить флаги гравитации в пользовательском представлении Android? Определение требований к питанию для бесконтактной смарт-карты на Java. Является ли google-services.json конфиденциальной? Кэширование загруженных данных JSON в базу данных SQLite – это хорошая идея? Показывать записи сверху с помощью ListView Как получить представление больше, чем его родитель? Как предотвратить пропущенный неиспользуемый класс аннотаций от сбоя моей программы? Активность Android / Intent против Qt Signal / Slot против iPhone? /? Кнопка добавления, например, «Новая почта» в приложении Gmail. Использование Google Guava с Android 1.6 Есть ли разница между «ListView.invalidateViews ()» и «Adapter.notifyDataSetChanged ()»? Ошибка: (3, 0) Причина: org / apache / commons / lang3 / StringUtils Функция прокрутки отключает вертикальную прокрутку – Chrome для Android