问题 获取Android手机的主电子邮件帐户


我正在开发一个项目,我必须使用用户的主电子邮件自动填充EditText,我将主电子邮件视为与Google Play商店相关联的电子邮件。我读过了 这个 发布并实施,

如果我们使用AccountManager类来设置电子邮件ID,我们将获得该电话中添加的所有电子邮件ID,因此这是不可能的,有些人说要获取AccountManager返回的第一个电子邮件ID,但是返回第一次在手机中添加的电子邮件ID。

即 假设我已经添加了test@gmail.com并将其与google play相关联,之后我添加了test_new@gmail.com并将此帐户与Play商店相关联,此时我正在使用此帐户的Play商店。如果我写了如下代码;

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

声明的预期结果是 test_new@gmail.com,但我得到test@gmail.com

有什么方法可以解决这个问题吗?

请帮我提出你的想法。


5761
2017-09-08 06:48


起源

预期的声明是test@gmail.com,但我收到test@gmail.com? - N J
错字,预期输出是与Play商店相关联的电子邮件ID,这里是test_new@gmail.com - droidev
你可以尝试这个..已经回答[这里] [1] [1]: stackoverflow.com/questions/2112965/... - Thiyagu
请阅读问题,我已经提到了该问题的链接,该帖子中的答案与我无关,因为它只返回帐户列表 - droidev
我认为不可能知道哪个谷歌(gmail)帐户用于Play商店。 - Jared Rummler


答案:


据我所知,android中没有主电子邮件ID的概念。并且无法获得与Play商店相关联的电子邮件ID。所以我所做的是,我已经获取了所有gmail id并取了最后一个,它不是主要的电子邮件ID,但它应该是他设备中第一个添加的Google帐户。所以在正常使用情况下,用户不会使用他第一次添加的电子邮件ID。所以我们可以将其视为主邮件ID。


8
2018-03-02 07:03





我同意@driodev。但我用不同的方法做到了。 只需复制并粘贴代码......我可能会稍微回答这个问题,但我保证这将对很多人有所帮助。事实上,我认为我们可以通过更改getAccount(“com.example”)中的字符串来获取Android设备中使用的任何帐户ID。这是代码。

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
2018-04-15 07:24



我尝试了这个,但为什么我打印时我的Android设备会一直无效?我的设备仅在一个Google帐户gmail上运行。 - DaveNOTDavid
你在清单中添加了权限!!你在上面的“com.google”中检查了拼写错误的错误吗?我把它作为“com.gogle”用于诡计我无法弄清楚问题出在哪里..如果你能提供你的帮助我会很有帮助代码段 - Mohammed Nathar
这应该是清单中的权限<uses-permission android:name =“android.permission.GET_ACCOUNTS”/> - Mohammed Nathar
是的,我已将权限包含在我的清单中。这是我的代码片段: stackoverflow.com/questions/36750402/... - DaveNOTDavid
我也有这个问题。这也需要阅读联系人权限。 - Vishnu V


您“与Play商店相关联”的帐户只是Play应用的应用偏好设置。你看不懂。用户可以下载/购买一些带有测试的应用程序和一些带有test_new的应用程序。


2
2018-03-08 17:36





一些补充 @ 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;
    }
}

或者如果你愿意,你可以用一个“if”来做。


0
2018-04-11 05:44





每当用户分配email_id然后android用Email编写一个日历。如果上面的解决方案不适合你,那么你可以尝试这个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;
}

0
2017-10-03 05:45