web-dev-qa-db-fra.com

obtenir le compte de messagerie principal du téléphone Android

Je travaille sur un projet et je dois remplir automatiquement EditText avec l'adresse électronique principale de l'utilisateur. J'envisage l'adresse électronique principale en tant qu'e-mail associé à Google Play Store. J'ai lu ce post et mis en œuvre que,

si nous utilisons la classe AccountManager pour obtenir les identifiants de messagerie, nous aurons tous les identifiants de messagerie ajoutés à ce téléphone. Ce n'est donc pas possible. Certains disent de prendre le premier identifiant de messagerie renvoyé par AccountManager, identifiant de messagerie qui a été ajouté au téléphone pour la première fois.

c'est-à-dire supposons que j'ai ajouté [email protected] et lié cela avec Google Play, plus tard, j'ai ajouté [email protected] et associé ce compte à Play Store, j'utilise maintenant Play Store avec ce compte. . si j'ai écrit le code comme suit; 

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

la valeur attendue pour la déclaration est [email protected] , mais j'obtiens [email protected]

y a-t-il un moyen de résoudre ce problème?

aidez-moi s'il vous plaît contribuant vos idées.

12
droidev

Autant que je sache, il n'y a pas de concept d'identifiant de messagerie primaire dans Android. et il n'y a aucun moyen d'obtenir un identifiant de messagerie associé à Play Store. Donc, ce que j'ai fait est, j'ai récupéré tous les identifiants gmail et pris le dernier, ce n'est pas l'identifiant principal de l'e-mail, mais il devrait être le premier compte Google ajouté dans son appareil. Ainsi, dans des cas d'utilisation normaux, l'utilisateur ne jouera pas avec son premier identifiant de courrier électronique ajouté. nous pouvons donc l'assumer comme identifiant de messagerie principal.

9
droidev

Je suis d'accord avec @driodev. mais je l'ai fait avec une approche différente. copiez-collez simplement le code ... Je vais peut-être répondre à cette question un peu tard, mais je vous garantis que cela sera utile pour beaucoup à l'avenir. En fait, je pense que nous pouvons obtenir n'importe quel identifiant de compte utilisé sur le périphérique Android simplement en modifiant la chaîne dans getAccount ("com.example"). Voici le code. 

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

Le compte que vous avez "associé au Play Store" est simplement une préférence d'application de l'application Play. Vous ne pouvez pas lire ça. L'utilisateur peut télécharger/acheter des applications avec test et d'autres avec test_new.

2
bryan

Quelques ajouts à @ @ MohammedNathar answer. Sur Android 6.0 et les versions ultérieures, n'oubliez pas de demander des autorisations, car cette version présente des aspects paranoïaques:

Manifeste:

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

Demande:

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

Et dans activité  

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

Ou vous pouvez le faire avec un "si" si vous voulez.

0

Chaque fois que l'utilisateur attribue email_id puis Android crée un calendrier avec Email.So. Si la solution ci-dessus ne vous convient pas, vous pouvez l'essayer en bidouillage. Trouver un e-mail associé à Calendrier. J'espère que cela vous aidera.

    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