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

Posted

技术标签:

【中文标题】如何获取 Android 用户的电子邮件地址?【英文标题】:How can you get an Android user's email address? 【发布时间】:2011-02-03 03:08:52 【问题描述】:

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

【问题讨论】:

看到这个问题:***.com/questions/2112965/… 我的代码适用于 2 个以上的 Android 版本,但我希望它能对某人有所帮助。它获取所有者姓名、电子邮件和电话(用户除了同步帐户之外可能还有电子邮件)。在 android 2.3 上测试gist.github.com/3904299 为什么好的问题会被关闭?我开始越来越多地看到这一点。 【参考方案1】:

你为什么要这么做?

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;
  

在您的 AnroidManifest.xml 中

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

【讨论】:

这看起来很不错......但我需要一些适用于 Android 1.5 的东西吗?你有任何旧 API 的课程吗? 这在 Android 1 中不起作用。* 恐怕。如果有任何安慰,您仍然可以在面向 1.5 的应用程序中使用它,并干净地检测何时该功能不可用 try String name = UserEmailFetcher.getEmail(this); catch (VerifyError e) // 如果 AccountManager 不可用(例如 1.x)会发生 您需要在清单中使用 它被隐藏了,你必须使用反射来获得它。如果你真的需要,不要这样做。 它在所有 android 版本中都能正常工作,但在 Oreo 8.0 上不工作,任何人都面临同样的问题和@JimBlackler ? 我用的是android 10,邮箱是空的,不知道为什么。【参考方案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)有什么意义?在这两种情况下,它的作用完全相同。【参考方案3】:

正在开发 MarshMallow 版本

btn_click=(按钮) 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);
        
    
);

【讨论】:

【参考方案4】:

我找到了解决办法

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...
        
    

【讨论】:

以上是关于如何获取 Android 用户的电子邮件地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取设备用户的电子邮件地址? [复制]

Android Facebook通过访问令牌获取登录的电子邮件地址

春季安全。如何获取用户电子邮件地址?

Twitter 如何在 Android Studio 中使用 Fabric 插件获取用户个人资料图片

如何使用 Facebook API 获取用户的辅助电子邮件地址

Android - 如何获取 google plus 访问令牌?