Jak uzyskać główny adres e-mail Androida (lub listę adresów e-mail)?
Rozumiem, że w OS 2.0+ istnieje obsługa wielu adresów e-mail, ale poniżej 2.0 możesz mieć tylko jeden adres e-mail na urządzenie.
Jak uzyskać główny adres e-mail Androida (lub listę adresów e-mail)?
Rozumiem, że w OS 2.0+ istnieje obsługa wielu adresów e-mail, ale poniżej 2.0 możesz mieć tylko jeden adres e-mail na urządzenie.
Odpowiedzi:
Można to zrobić na kilka sposobów, pokazanych poniżej.
Jako przyjacielskie ostrzeżenie zachowaj ostrożność i bezpośredni kontakt z użytkownikiem, mając do czynienia z kontem, profilem i danymi kontaktowymi. Jeśli niewłaściwie wykorzystasz adres e-mail użytkownika lub inne dane osobowe, mogą się zdarzyć złe rzeczy.
Możesz użyć AccountManager.getAccounts
lub, AccountManager.getAccountsByType
aby uzyskać listę wszystkich nazw kont na urządzeniu. Na szczęście dla niektórych typów kont (w tym com.google
) nazwy kont to adresy e-mail. Przykładowy fragment poniżej.
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;
...
}
}
Pamiętaj, że wymaga to GET_ACCOUNTS
pozwolenia:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Więcej informacji na temat korzystania AccountManager
można znaleźć w przykładowym kodzie Menedżera kontaktów w zestawie SDK.
Począwszy od Androida 4.0 (Ice Cream Sandwich), możesz uzyskać adresy e-mail użytkownika, uzyskując dostęp do jego profilu. Dostęp do profilu użytkownika jest nieco ciężki, ponieważ wymaga dwóch uprawnień (więcej na ten temat poniżej), ale adresy e-mail są dość wrażliwymi fragmentami danych, więc jest to cena wstępu.
Poniżej znajduje się pełny przykład, który wykorzystuje CursorLoader
do pobierania wierszy danych profilu zawierających adresy e-mail.
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;
}
}
Wymaga to zarówno uprawnień, jak READ_PROFILE
i READ_CONTACTS
uprawnień:
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
cursor.isAfterLast()
zawsze zwraca true. Dowolny pomysł?
Może to być przydatne dla innych:
Korzystanie z AccountPicker w celu uzyskania adresu e-mail użytkownika bez żadnych globalnych uprawnień oraz umożliwienie użytkownikowi bycia świadomym, autoryzacji lub anulowania procesu.
Chciałbym skorzystać z AccountPicker Androida , wprowadzonego w ICS.
Intent googlePicker = AccountPicker.newChooseAccountIntent(null, null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null);
startActivityForResult(googlePicker, REQUEST_CODE);
A następnie poczekaj na wynik:
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
, co zostało zdefiniowane jako „niebezpieczne” uprawnienie (wymaga żądania w czasie wykonywania): developer.android.com/reference/android/…
Istnieje interfejs API Androida, który pozwala użytkownikowi wybrać adres e-mail bez potrzeby uzyskania pozwolenia. Spójrz na: 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);
}
Spowoduje to wyświetlenie próbnika, w którym użytkownik może wybrać adres e-mail. Wynik zostanie dostarczony zaonActivityResult()
Niestety odpowiedź nie działa.
Spóźniłem się, ale oto rozwiązanie dla wewnętrznej aplikacji e-mail dla Androida, chyba że dostawca uri zmienił treść:
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;
}
Jest to dość trudna rzecz w Androidzie i jeszcze tego nie zrobiłem. Ale może te linki mogą ci pomóc:
Użyj tej metody:
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 "";
}
Pamiętaj, że wymaga to GET_ACCOUNTS
pozwolenia:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Następnie:
editTextEmailAddress.setText(getUserEmail());
Sugerowane odpowiedzi nie będą już działać, ponieważ na Androida 8 wprowadzono nowe ograniczenie.
więcej informacji tutaj: https://developer.android.com/about/versions/oreo/android-8.0-changes.html#aaad
Android GET_ACCOUNTS
ostatnio się zablokował, więc niektóre odpowiedzi nie działały dla mnie. Mam to działa na Androidzie 7.0 z zastrzeżeniem, że Twoi użytkownicy muszą znosić okno uprawnień.
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);
}
}
}
Praca w systemie operacyjnym 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 {
// 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);
}
}
});
Dodaj tę pojedynczą linię do manifestu ( za pozwoleniem )
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Następnie wklej ten kod do swojej aktywności
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;
}