如何获取Android用户的电子邮件地址?

38

我拥有android.permission.READ_OWNER_DATA权限,但我找不到可靠的代码来解释如何读取设备所有者的电子邮件地址。我该怎么做?


1
请查看这个问题:https://dev59.com/ZnI95IYBdhLWcg3w3yFU - Erich Douglass
1
我的代码适用于2个或更高版本的Android,但我希望它能帮助到其他人。 它可以获取所有者的姓名、电子邮件和电话(用户可能除了同步账户外还有其他电子邮件)。 已在Android 2.3上进行了测试。https://gist.github.com/3904299 - Jehy
5
为什么好问题会被关闭?我越来越频繁地看到这种情况发生。 - Jared Burrows
4个回答

91

你为什么想要那么做?

import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.Context;

/**
 * This class uses the AccountManager to get the primary email address of the
 * current user.
 */
public class UserEmailFetcher {

  static String getEmail(Context context) {
    AccountManager accountManager = AccountManager.get(context); 
    Account account = getAccount(accountManager);

    if (account == null) {
      return null;
    } else {
      return account.name;
    }
  }

  private static Account getAccount(AccountManager accountManager) {
    Account[] accounts = accountManager.getAccountsByType("com.google");
    Account account;
    if (accounts.length > 0) {
      account = accounts[0];      
    } else {
      account = null;
    }
    return account;
  }
}
在你的AndroidManifest.xml文件中。
<uses-permission android:name="android.permission.GET_ACCOUNTS" />

这看起来很不错...但我需要适用于Android 1.5的东西?你有在旧API中使用的类吗? - nikib3ro
2
很抱歉,这在 Android 1.* 上无法运行。如果你需要安慰的话,你仍然可以在针对 1.5 的应用程序中使用它,并通过以下方式清晰地检测到功能不可用: try { String name = UserEmailFetcher.getEmail(this);} catch (VerifyError e) { // 如果 AccountManager 不可用(例如 1.x),则会发生此情况 }你需要在你的清单文件中添加 <uses-sdk android:minSdkVersion="3" /> 。 - Jim Blackler
它被隐藏了,你必须使用反射才能获取它。如果你不是真的需要,就不要这样做。 - alexanderblom
它在所有的安卓版本上都运行良好,但在Oreo 8.0上无法工作,是否有人遇到了相同的问题和@JimBlackler? - Mehul Gajjar
1
我正在使用Android 10,但是我的电子邮件为空,我不知道为什么。 - GSandro_Strongs
在Android 11上,我通过调用getAccount(accountManager)获取Gmail ID,但其类型为“com.osp.app.signin”,而不是“com.google”。 - Imran Khan Saifi

2
请在您的清单文件中添加此权限。
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
在您的MainActivity.java中添加此功能。

    public void getAccounts() {
        StringBuilder emailAccounts = new StringBuilder();

        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.GET_ACCOUNTS)) {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.GET_ACCOUNTS}, 1);
            } else {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.GET_ACCOUNTS}, 1);
            }
        }
        else {
            List<String> accountList = new ArrayList<String>();
            Pattern gmailPattern = Patterns.EMAIL_ADDRESS;
            Account[] accounts = AccountManager.get(this).getAccounts();
            for (Account account : accounts) {
                if (gmailPattern.matcher(account.name).matches()) {
                    emailAccounts.append(flag + ". " + "<b>" + account.name + "<br>" +
                            "---------" + "---------<br>"); ;
                }
            }
            deviceDetails.setText(Html.fromHtml(emailAccounts+""));
        }
    }

现在,在您的onCreate()方法中调用此函数,如下所示。

getAccounts();


第二个 if 结构(带有 ActivityCompat)的意义是什么?在两种情况下它都执行相同的操作。 - juzraai

1
正在开发MarshMallow版本。

btn_click=(Button) findViewById(R.id.btn_click);

的英译中文为:

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 {

// 低于棉花糖版本

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


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

-2

我找到了解决方案

startActivityForResult(intent, ANY_CODE);

@Override
    protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == ANY_CODE&& resultCode == RESULT_OK) {
            String emailAddress = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
            // do something...
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接