it-roy-ru.com

получить основную учетную запись электронной почты телефона Android

Я работаю над проектом, и мне нужно автоматически заполнить EditText основной электронной почтой пользователя, я рассматриваю основную электронную почту как электронную почту, связанную с Google Play Store. Я прочитал это пост и реализовал это,

если мы используем класс AccountManager для получения идентификаторов электронной почты, мы получим все идентификаторы электронной почты, добавленные в этот телефон, так что это невозможно, и некоторые говорят, что нужно взять первый идентификатор электронной почты, возвращенный AccountManager, но который возвращает идентификатор электронной почты, добавленный в телефон в первый раз.

то есть предположим, что я добавил [email protected] и связал его с Google Play, позже я добавил [email protected] и связал эту учетную запись с Play Store, сейчас я использую Play Store с этой учетной записью. если бы я написал код следующим образом; 

        Account[] accountList = AccountManager.get(this).getAccountsByType("com.google");
    Log.d("Play Store account:" , accountList[0].name);

ожидаемый результат для заявления [email protected], но я получаю [email protected]

есть ли способ решить эту проблему?

пожалуйста, помогите мне внести ваши идеи.

12
droidev

Насколько я читал, в Android нет понятия первичного идентификатора электронной почты. и нет способа получить идентификатор электронной почты, связанный с Play Store. так что я сделал, я взял все идентификаторы Gmail и взял последний, это не основной идентификатор электронной почты, но это должен быть первый добавленный аккаунт Google на своем устройстве. поэтому в обычных случаях использования пользователь не будет играть со своим первым добавленным идентификатором электронной почты. таким образом, мы можем принять это как основной почтовый идентификатор.

9
droidev

Я согласен с @driodev. но я сделал это с другим подходом .. просто скопируйте и вставьте код ... Я мог бы ответить на этот вопрос немного поздно, но я гарантирую, что это будет полезно для многих в будущем. На самом деле, я думаю, что мы можем получить любой идентификатор учетной записи, который используется на устройстве Android, просто изменив строку в getAccount ("com.example"). Вот код 

String User_EmailId = getEmiailID(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;
}    

3
Mohammed Nathar

Учетная запись, которую вы «связали с Play Store», является лишь предпочтением приложения Play. Вы не можете прочитать это. Пользователь может загрузить/купить некоторые приложения с помощью test, а некоторые - с test_new.

2
bryan

Некоторые дополнения к ответу @ MohammedNathar. На Android 6.0 и выше, не забудьте запросить разрешения, потому что эти версии несколько параноики:

Manifest:

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

Или вы можете сделать это с одним «если», если хотите.

0
Илья Сараев

Всякий раз, когда пользователь назначает email_id, Android создает календарь с помощью Email.Так, если вышеуказанное решение не подходит для вас, вы можете попробовать это как хак . Найти электронную почту, связанную с Календарем . Надеюсь, это поможет.

    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;
}
0
Prinkal Kumar