Получить основную учетную запись электронной почты телефона android
Я работаю над проектом, и я должен заполнить EditText автоматически с помощью первичного электронного письма пользователя, я рассматриваю первичный адрес электронной почты как письмо, связанное с магазином игры Google. Я прочитал этот пост и реализовал это,
если мы используем класс AccountManager для получения идентификаторов электронной почты, мы получим все идентификатор электронной почты, добавленные на этом телефоне, так что это невозможно, а некоторые говорят, что берут первый идентификатор электронной почты, возвращаемый AccountManager, но который возвращает идентификатор электронной почты, который был добавлен в телефон в первый раз.
т.е.
предположим, что я добавил [email protected] и связал это с google play, позже я добавил [email protected] и связал эту учетную запись с магазином воспроизведения, прямо сейчас я использую play-магазин с этой учетной записью. если я написал код следующим образом;
Account[] accountList = AccountManager.get(this).getAccountsByType("com.google");
Log.d("Play store account:" , accountList[0].name);
ожидаемый вывод для оператора [email protected], но я получаю [email protected]
есть ли способ решить эту проблему?
пожалуйста, помогите мне внести свой вклад в ваши идеи.
Ответы
Ответ 1
Насколько я понимаю, в андроиде нет понятия первичного идентификатора электронной почты. и нет способа получить идентификатор электронной почты, связанный с магазином воспроизведения. так что я сделал это, я выбрал все идентификаторы gmail и взял последний, это не основной идентификатор электронной почты, но он должен быть первым добавленным аккаунтом google на его устройстве. поэтому в обычных случаях использования пользователь не будет играть со своим первым добавленным идентификатором электронной почты. поэтому мы можем считать его основным идентификатором почты.
Ответ 2
Учетная запись, связанная с Play Маркетом, является преимуществом приложения Play. Вы не можете это прочитать. Пользователь может загружать/приобретать некоторые приложения с тестом, а некоторые - с test_new.
Ответ 3
Я согласен с @driodev. но я сделал это с другим подходом.
просто скопируйте и вставьте код.... я мог бы ответить на этот вопрос немного поздно, но я гарантирую, что это будет полезно для многих в будущем. В результате я думаю, мы можем получить любой идентификатор учетной записи, который используется в устройстве Android, изменяя строку в getaccount ( "com.example" ). Вот код.
String User_EmailId = getEmiailID(getApplicationContext());
private String getEmiailID(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;
}
`
Ответ 4
Некоторые дополнения к ответу @MohammedNathar. На 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;
}
}
И в активности
@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;
}
}
Или вы можете сделать это с помощью одного "если", если хотите.
Ответ 5
Всякий раз, когда пользователь назначает email_id, андроид создает календарь с помощью электронной почты. Поэтому, если вышеприведенное решение не окажется для вас, вы можете попробовать это как взломать.
Найдите электронную почту, связанную с календарем.
Надеюсь, это поможет.
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;
}