Hay varias formas de hacer esto, que se muestran a continuación.
Como advertencia amistosa, tenga cuidado y sea sincero con el usuario cuando maneje datos de cuenta, perfil y contacto. Si utiliza indebidamente la dirección de correo electrónico de un usuario u otra información personal, pueden ocurrir cosas malas.
Método A: usar AccountManager (API nivel 5+)
Puede usar AccountManager.getAccounts
u AccountManager.getAccountsByType
obtener una lista de todos los nombres de cuenta en el dispositivo. Afortunadamente, para ciertos tipos de cuenta (incluidos com.google
), los nombres de las cuentas son direcciones de correo electrónico. Fragmento de ejemplo 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 GET_ACCOUNTS
permiso:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
AccountManager
Puede encontrar más información sobre el uso en el código de muestra de Contact Manager en el SDK.
A partir de Android 4.0 (Ice Cream Sandwich), puede obtener las direcciones de correo electrónico del usuario accediendo a su perfil. Acceder al perfil de usuario es un poco pesado, ya que requiere dos permisos (más sobre eso a continuación), pero las direcciones de correo electrónico son datos bastante confidenciales, por lo que este es el precio de admisión.
A continuación se muestra un ejemplo completo que utiliza un CursorLoader
para recuperar 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 permisos READ_PROFILE
y READ_CONTACTS
:
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />