Wie erhalten Sie die primäre E-Mail-Adresse von Android (oder eine Liste mit E-Mail-Adressen)?
Nach meinem Verständnis werden unter OS 2.0+ mehrere E-Mail-Adressen unterstützt, aber unter 2.0 können Sie nur eine E-Mail-Adresse pro Gerät haben.
Wie erhalten Sie die primäre E-Mail-Adresse von Android (oder eine Liste mit E-Mail-Adressen)?
Nach meinem Verständnis werden unter OS 2.0+ mehrere E-Mail-Adressen unterstützt, aber unter 2.0 können Sie nur eine E-Mail-Adresse pro Gerät haben.
Antworten:
Es gibt verschiedene Möglichkeiten, dies zu tun (siehe unten).
Seien Sie als freundliche Warnung vorsichtig und offen gegenüber dem Benutzer, wenn Sie mit Konto-, Profil- und Kontaktdaten umgehen. Wenn Sie die E-Mail-Adresse eines Benutzers oder andere persönliche Informationen missbrauchen, können schlimme Dinge passieren.
Sie können AccountManager.getAccounts
oder verwenden AccountManager.getAccountsByType
, um eine Liste aller Kontonamen auf dem Gerät abzurufen. Glücklicherweise sind die Kontonamen für bestimmte Kontotypen (einschließlich com.google
) E-Mail-Adressen. Beispielausschnitt unten.
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;
...
}
}
Beachten Sie, dass hierfür die GET_ACCOUNTS
Berechtigung erforderlich ist :
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Weitere Informationen zur Verwendung AccountManager
finden Sie im Contact Manager Beispielcode im SDK.
Ab Android 4.0 (Ice Cream Sandwich) können Sie die E-Mail-Adressen des Benutzers abrufen, indem Sie auf sein Profil zugreifen. Der Zugriff auf das Benutzerprofil ist etwas schwerfällig, da zwei Berechtigungen erforderlich sind (mehr dazu weiter unten), aber E-Mail-Adressen sind ziemlich vertrauliche Daten, daher ist dies der Eintrittspreis.
Im Folgenden finden Sie ein vollständiges Beispiel, CursorLoader
in dem Profildatenzeilen mit E-Mail-Adressen mit a abgerufen werden.
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;
}
}
Dies erfordert sowohl die READ_PROFILE
als auch die READ_CONTACTS
Berechtigungen:
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
cursor.isAfterLast()
gibt immer true zurück. Irgendeine Idee?
Dies könnte für andere nützlich sein:
Verwenden von AccountPicker, um die E-Mail-Adresse des Benutzers ohne globale Berechtigungen abzurufen und dem Benutzer zu ermöglichen, den Vorgang zu kennen und zu autorisieren oder abzubrechen.
Ich würde den in ICS eingeführten AccountPicker von Android verwenden .
Intent googlePicker = AccountPicker.newChooseAccountIntent(null, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null);
startActivityForResult(googlePicker, REQUEST_CODE);
Und dann warten Sie auf das Ergebnis:
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.permission.GET_ACCOUNTS
"gefährliche" Berechtigung erfordert (Laufzeitanforderung erforderlich): developer.android.com/reference/android/…
Es gibt eine Android-API, mit der der Benutzer seine E-Mail-Adresse ohne Erlaubnis auswählen kann. Schauen Sie sich Folgendes an: https://developers.google.com/identity/smartlock-passwords/android/retrieve-hints
HintRequest hintRequest = new HintRequest.Builder()
.setHintPickerConfig(new CredentialPickerConfig.Builder()
.setShowCancelButton(true)
.build())
.setEmailAddressIdentifierSupported(true)
.setAccountTypes(IdentityProviders.GOOGLE)
.build();
PendingIntent intent = mCredentialsClient.getHintPickerIntent(hintRequest);
try {
startIntentSenderForResult(intent.getIntentSender(), RC_HINT, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Could not start hint picker Intent", e);
}
Dies zeigt eine Auswahl an, in der der Benutzer eine E-Mail-Adresse auswählen kann. Das Ergebnis wird in geliefertonActivityResult()
Leider funktioniert die akzeptierte Antwort nicht.
Ich bin spät dran, aber hier ist die Lösung für die interne Android-E-Mail-Anwendung, es sei denn, die Inhalts-URL wird vom Anbieter geändert:
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;
}
Dies ist ziemlich schwierig in Android und ich habe es noch nicht getan. Aber vielleicht helfen Ihnen diese Links:
Verwenden Sie diese Methode:
public String getUserEmail() {
AccountManager manager = AccountManager.get(App.getInstance());
Account[] accounts = manager.getAccountsByType("com.google");
List<String> possibleEmails = new LinkedList<>();
for (Account account : accounts) {
possibleEmails.add(account.name);
}
if (!possibleEmails.isEmpty() && possibleEmails.get(0) != null) {
return possibleEmails.get(0);
}
return "";
}
Beachten Sie, dass hierfür die GET_ACCOUNTS
Berechtigung erforderlich ist :
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Dann:
editTextEmailAddress.setText(getUserEmail());
Die vorgeschlagenen Antworten funktionieren nicht mehr, da ab Android 8 eine neue Einschränkung gilt.
Weitere Informationen hier: https://developer.android.com/about/versions/oreo/android-8.0-changes.html#aaad
Android wurde GET_ACCOUNTS
kürzlich gesperrt, sodass einige der Antworten bei mir nicht funktionierten. Ich habe dies auf Android 7.0 mit der Einschränkung funktioniert, dass Ihre Benutzer einen Berechtigungsdialog ertragen müssen.
AndroidManifest.xml
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
MainActivity.java
package com.example.patrick.app2;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.accounts.AccountManager;
import android.accounts.Account;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.*;
public class MainActivity extends AppCompatActivity {
final static int requestcode = 4; //arbitrary constant less than 2^16
private static String getEmailId(Context context) {
AccountManager accountManager = AccountManager.get(context);
Account[] accounts = accountManager.getAccountsByType("com.google");
Account account;
if (accounts.length > 0) {
account = accounts[0];
} else {
return "length is zero";
}
return account.name;
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case requestcode:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
String emailAddr = getEmailId(getApplicationContext());
ShowMessage(emailAddr);
} else {
ShowMessage("Permission Denied");
}
}
}
public void ShowMessage(String email)
{
AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
alertDialog.setTitle("Alert");
alertDialog.setMessage(email);
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
alertDialog.show();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Context context = getApplicationContext();
if ( ContextCompat.checkSelfPermission( context, android.Manifest.permission.GET_ACCOUNTS )
!= PackageManager.PERMISSION_GRANTED )
{
ActivityCompat.requestPermissions( this, new String[]
{ android.Manifest.permission.GET_ACCOUNTS },requestcode );
}
else
{
String possibleEmail = getEmailId(getApplicationContext());
ShowMessage(possibleEmail);
}
}
}
Arbeiten im MarshMallow-Betriebssystem
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 {
// Lower then 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);
}
}
});
Fügen Sie diese einzelne Zeile im Manifest hinzu ( zur Erlaubnis )
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Fügen Sie diesen Code dann in Ihre Aktivität ein
private ArrayList<String> getPrimaryMailId() {
ArrayList<String> accountsList = new ArrayList<String>();
try {
Account[] accounts = AccountManager.get(this).getAccountsByType("com.google");
for (Account account : accounts) {
accountsList.add(account.name);
Log.e("GetPrimaryMailId ", account.name);
}
} catch (Exception e) {
Log.e("GetPrimaryMailId", " Exception : " + e);
}
return accountsList;
}