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.
- ¿Cómo puedo enviar un correo electrónico de la aplicación android directamente sin mostrar el formulario de correo electrónico predeterminado del dispositivo?
- Error de E / S al usar correo, activación y archivos jar adicionales en android stdio
- Android - Cómo averiguar si el correo electrónico se envió comprobando los elementos enviados
- El cuerpo del correo electrónico no se muestra cuando se utiliza un intento
- ¿Cómo puedo iniciar la aplicación de correo electrónico con el campo "a" pre-llenado?
- No se puede configurar el correo k-9 (k-9-5.107) en la aplicación android?
- Error al enviar correo con JavaMail API
- Establecer dirección de correo destino en Firebase Invites
- Enviar correo electrónico mediante programación mediante la cuenta de usuario predeterminada
- Cómo enviar correos electrónicos con archivos adjuntos de gran tamaño utilizando la API de cliente de gmail en Android
- Android: Cómo obtener el nombre del paquete de clientes de correo electrónico nativo
- ¿Cómo enviar un correo electrónico simple mediante programación? (Existe una manera simple de hacerlo?)
- Obtener notificación enviada por correo electrónico en onActivityResult "Android"
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 ocultar la barra de acción antes de que se cree la actividad, y luego mostrarla de nuevo?
- Carga perezosa de imágenes en ListView