如何获得 Android phone 的主电子邮件帐户?
How can I get Primary Email Account of Android phone?
我正在做一个项目,我必须用用户的主要电子邮件自动填充 EditText,我正在考虑将主要电子邮件作为与 google Play 商店关联的电子邮件。我已阅读 this post 并实施了它。
如果我们使用 AccountManager class 来获取电子邮件 ID,我们将获取添加到 phone 中的所有电子邮件 ID,所以这是不可能的,有些人说采取AccountManager 返回的第一个电子邮件 ID,但是 returns 第一次添加到 phone 中的电子邮件 ID。
即
假设我添加了 test@gmail.com 并将其与 Google Play 相关联,稍后我添加了 test_new@gmail.com 并将此帐户与 Play 商店相关联,现在我正在使用使用此帐户玩商店。如果我写了如下代码:
Account[] accountList = AccountManager.get(this).getAccountsByType("com.google");
Log.d("Play store account:" , accountList[0].name);
该语句的预期输出是 test_new@gmail.com,但我正在测试@gmail.com
我该如何解决这个问题?
据我所知,android 中没有主电子邮件 ID 的概念。并且无法获取与 Play 商店关联的电子邮件 ID。所以我所做的是,我获取了所有 gmail id 并获取了最后一个,它不是主电子邮件 id,但它应该是他设备中第一个添加的 google 帐户。所以在正常使用情况下,用户不会使用他的第一个添加的电子邮件 ID。所以我们可以假设它是主邮件 ID。
您拥有的帐户 "associated with the Play Store" 只是 Play 应用的应用偏好。你看不懂。用户可以 download/purchase 一些应用程序进行测试,一些应用程序进行 test_new。
我同意,但我用了不同的方法。
只需复制并粘贴代码...我可能会晚一点回答这个问题,但我保证这对将来的许多人都有帮助。事实上,我认为我们可以通过更改 getAccount("com.example") 中的字符串来获取 android 设备中使用的任何帐户 ID。这是代码。
String userEmailId = getEmailID(getApplicationContext());
private String getEmailID(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;
}
的一些补充。在Android 6.0及以上,不要忘记请求权限,因为这个版本有些偏执:
清单:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
要求:
private void requestPermissions(Activity activity) {
if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.GET_ACCOUNTS}, 101);
return null;
}
}
并且在activity
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
boolean result = false;
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
result = true;
switch (requestCode) {
case 101:
if (result) Log.d(Constants.LOG, "Permission GET_ACCOUNTS granted");
break;
}
}
或者如果你愿意,你可以用一个“如果”来完成。
每当用户分配 email_id 然后 android 创建一个带有 Email.So 的日历,如果上述解决方案不适合您,那么您可以尝试将此作为 hack。
查找与日历关联的电子邮件。
public String getCalendarIdAndEmail(Context c) {
String projection[] = {"_id", "calendar_displayName"};
// Uri calendars = Uri.parse("content://com.android.calendar/calendars");
String calID = null;
try {
ContentResolver contentResolver = c.getContentResolver();
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
return calID;
}
Cursor managedCursor = contentResolver.query(CalendarContract.Calendars.CONTENT_URI, projection, CalendarContract.Calendars.VISIBLE + " = 1 AND " + CalendarContract.Calendars.IS_PRIMARY + "=1", null, CalendarContract.Calendars._ID + " ASC");
if (managedCursor.getCount() <= 0) {
managedCursor = contentResolver.query(CalendarContract.Calendars.CONTENT_URI, projection, CalendarContract.Calendars.VISIBLE + " = 1", null, CalendarContract.Calendars._ID + " ASC");
} else {
Log.d("getCount", "" + managedCursor.getCount());
}
if (managedCursor.moveToFirst()) {
int nameCol = managedCursor.getColumnIndex(projection[1]);
int idCol = managedCursor.getColumnIndex(projection[0]);
do {
String calName = managedCursor.getString(nameCol);
calID = managedCursor.getString(idCol);
//CalName is Email id you are looking for
Log.e("tag", "calName " + calName + "____calId " + calID);
} while (managedCursor.hasNext());//managedCursor.moveToNext());
managedCursor.close();
}
} catch (Exception e) {
Log.e("error", e.getMessage(););
}
return calID;
}
我正在做一个项目,我必须用用户的主要电子邮件自动填充 EditText,我正在考虑将主要电子邮件作为与 google Play 商店关联的电子邮件。我已阅读 this post 并实施了它。
如果我们使用 AccountManager class 来获取电子邮件 ID,我们将获取添加到 phone 中的所有电子邮件 ID,所以这是不可能的,有些人说采取AccountManager 返回的第一个电子邮件 ID,但是 returns 第一次添加到 phone 中的电子邮件 ID。
即 假设我添加了 test@gmail.com 并将其与 Google Play 相关联,稍后我添加了 test_new@gmail.com 并将此帐户与 Play 商店相关联,现在我正在使用使用此帐户玩商店。如果我写了如下代码:
Account[] accountList = AccountManager.get(this).getAccountsByType("com.google");
Log.d("Play store account:" , accountList[0].name);
该语句的预期输出是 test_new@gmail.com,但我正在测试@gmail.com
我该如何解决这个问题?
据我所知,android 中没有主电子邮件 ID 的概念。并且无法获取与 Play 商店关联的电子邮件 ID。所以我所做的是,我获取了所有 gmail id 并获取了最后一个,它不是主电子邮件 id,但它应该是他设备中第一个添加的 google 帐户。所以在正常使用情况下,用户不会使用他的第一个添加的电子邮件 ID。所以我们可以假设它是主邮件 ID。
您拥有的帐户 "associated with the Play Store" 只是 Play 应用的应用偏好。你看不懂。用户可以 download/purchase 一些应用程序进行测试,一些应用程序进行 test_new。
我同意
String userEmailId = getEmailID(getApplicationContext());
private String getEmailID(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;
}
清单:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
要求:
private void requestPermissions(Activity activity) {
if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.GET_ACCOUNTS}, 101);
return null;
}
}
并且在activity
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
boolean result = false;
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
result = true;
switch (requestCode) {
case 101:
if (result) Log.d(Constants.LOG, "Permission GET_ACCOUNTS granted");
break;
}
}
或者如果你愿意,你可以用一个“如果”来完成。
每当用户分配 email_id 然后 android 创建一个带有 Email.So 的日历,如果上述解决方案不适合您,那么您可以尝试将此作为 hack。 查找与日历关联的电子邮件。
public String getCalendarIdAndEmail(Context c) {
String projection[] = {"_id", "calendar_displayName"};
// Uri calendars = Uri.parse("content://com.android.calendar/calendars");
String calID = null;
try {
ContentResolver contentResolver = c.getContentResolver();
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
return calID;
}
Cursor managedCursor = contentResolver.query(CalendarContract.Calendars.CONTENT_URI, projection, CalendarContract.Calendars.VISIBLE + " = 1 AND " + CalendarContract.Calendars.IS_PRIMARY + "=1", null, CalendarContract.Calendars._ID + " ASC");
if (managedCursor.getCount() <= 0) {
managedCursor = contentResolver.query(CalendarContract.Calendars.CONTENT_URI, projection, CalendarContract.Calendars.VISIBLE + " = 1", null, CalendarContract.Calendars._ID + " ASC");
} else {
Log.d("getCount", "" + managedCursor.getCount());
}
if (managedCursor.moveToFirst()) {
int nameCol = managedCursor.getColumnIndex(projection[1]);
int idCol = managedCursor.getColumnIndex(projection[0]);
do {
String calName = managedCursor.getString(nameCol);
calID = managedCursor.getString(idCol);
//CalName is Email id you are looking for
Log.e("tag", "calName " + calName + "____calId " + calID);
} while (managedCursor.hasNext());//managedCursor.moveToNext());
managedCursor.close();
}
} catch (Exception e) {
Log.e("error", e.getMessage(););
}
return calID;
}