Cómo obtener la dirección de correo electrónico principal del dispositivo Android

¿Cómo se obtiene la dirección de correo electrónico principal de Android (o una lista de direcciones de correo electrónico)?

Es mi entendimiento que en OS 2.0+ hay soporte para múltiples direcciones de correo electrónico, pero por debajo de 2.0 sólo puede tener una dirección de correo electrónico por dispositivo.

Hay varias formas de hacerlo, que se muestran a continuación.

Como una advertencia amable, tenga cuidado y de frente para el usuario cuando se trata de cuenta, perfil y datos de contacto. Si usa mal la dirección de correo electrónico de un usuario u otra información personal, pueden ocurrir cosas malas.

Método A. Utilizar AccountManager (nivel de API 5+)

Puede utilizar AccountManager.getAccounts o AccountManager.getAccountsByType para obtener una lista de todos los nombres de cuentas en el dispositivo. Afortunadamente, para ciertos tipos de cuenta (incluido com.google ), los nombres de cuenta son direcciones de correo electrónico. Ejemplo de fragmento a continuación.

 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; ... } } 

Tenga en cuenta que esto requiere el permiso GET_ACCOUNTS :

 <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 

Más información sobre el uso de AccountManager se puede encontrar en el código de ejemplo de Contact Manager en el SDK.

Método B. Utilice ContactsContract.Profile (API nivel 14+)

A partir de Android 4.0 (Ice Cream Sandwich), puede obtener las direcciones de correo electrónico del usuario accediendo a su perfil. El acceso al perfil de usuario es un poco pesado, ya que requiere dos permisos (más sobre esto a continuación), pero las direcciones de correo electrónico son piezas de datos bastante sensibles, por lo que este es el precio de admisión.

A continuación se muestra un ejemplo completo que utiliza un CursorLoader para recuperar las filas de datos de perfil que contienen direcciones de correo electrónico.

 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; } } 

Esto requiere los READ_PROFILE y READ_CONTACTS :

 <uses-permission android:name="android.permission.READ_PROFILE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> 

5/6/2012 – Se ha añadido información sobre el acceso al perfil para Android 4.0+

Esto podría ser útil para otros:

Utilizar AccountPicker para obtener la dirección de correo electrónico del usuario sin permisos globales y permitir al usuario conocer y autorizar o cancelar el proceso.

Yo utilizaría Android AccountPicker , introducido en ICS.

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

Y luego esperar el resultado:

 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; } 

Esto es bastante difícil de hacer en Android y no lo he hecho todavía. Pero tal vez estos enlaces pueden ayudarle:

  • Android Issue 1073: Los Tokens de Autenticación de Google deben ser accesibles a aplicaciones de terceros a través de una API
  • SDK API AccountManager en Andriod 2.x +

La respuesta tristemente aceptada no funciona.

Estoy tarde, pero aquí está la solución para la aplicación interna de correo electrónico de Android a menos que el contenido uri sea cambiado por el proveedor:

 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; } 

Trabajando en el sistema operativo 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 { 

// Baje luego Marshmallow

  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); } } }); 
  • ¿Cómo puedo obtener los mensajes en la carpeta de la bandeja de entrada del cliente de Gmail / correo electrónico?
  • ¿Cómo enviar contenido html con imagen a través de cliente de correo electrónico predeterminado de Android?
  • Cómo obtener la información de la cuenta de correo electrónico predeterminada en android ..?
  • Android - ¿Cómo abrir la aplicación de correo electrónico?
  • Compartir la imagen con la intención de Android
  • Enviar correo electrónico automáticamente desde la aplicación de Android a través de Exchange Server
  • ¿Existe un cliente de correo electrónico de código abierto de Android?
  • Cómo enviar correo de forma programática en android utilizando token OAuth2.0
  • Cómo adjuntar archivos con el envío de correo en la aplicación Android?
  • Pregunta la ayuda sobre el problema de lectura de AndroidManifest.xml
  • No puedo enviar correo desde Google Glass
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.