如何获取 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)会发生 您需要在清单中使用请在您的清单文件中添加此权限。
<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);
);
【讨论】:
我找到了解决办法
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 插件获取用户个人资料图片