【问题标题】:Get all types of accounts Android API 29获取所有类型的账户 Android API 29
【发布时间】:2019-10-01 00:42:28
【问题描述】:

我是 android 新手,正在尝试获取 android 用户在他/她的设备中注册的帐户列表。我已经使用android的客户经理来做到这一点,如下所示:

public static int count;
count=0;
JSONArray jsonArr = new JSONArray();
JSONObject emailObj = new JSONObject();
Account[] accounts = AccountManager.get(mContext).getAccounts();
        //Account[] accounts = AccountManager.get(mContext).getAccountsByType(null);
        for (Account account : accounts) {
            //possibleEmail += " "+account.name+" : "+account.type+" \n";

            JSONObject elem = new JSONObject();
            elem.put("name", account.name);
            elem.put("type", account.type);
            jsonArr.put(elem);
            //possibleEmail += " "+account.name+" \n";
            count++;
            emailObj.put("list",jsonArr);

        }

例如,上面的代码可以满足 API 级别 23 的要求。我得到的帐户列表如下:

[{"name":"agmailaccount@gmail.com","type":"com.google"},{"name":"agmailaccount2@gmail.com","type":"com.google"},{"name":"agmailaccount3@gmail.com","type":"com.google"},{"name":"handler","type":"com.twitter.android.auth.login"},{"name":"Facebook","type":"com.facebook.auth.login"},{"name":"LinkedIn","type":"com.linkedin.android"}]

请注意,我可以检测用户是否登录了第三方应用程序。我确实安装了linkedin、fb 和twitter,并且我从我的设备上登录了这些平台。我只需要捕获它(如上面的列表所示),而不是实际的帐户名称。

关键是,当我对 Android API 级别 29 使用相同的代码时,它不会返回像 com.twitter.android.auth.logincom.facebook.auth.login"com.linkedin.android 这样的第三方帐户。但是,我可以看到设备上登录的 gmail 帐户。如何在最近的 android 版本中检索此信息?

我还应该说我正在从 android 模拟器运行最新的 API 29,但不知道这是否是原因。我在模拟器中安装了linkedin、twitter和fb,并且也登录了那里。

我只需要得到与上面显示的结果相同的结果,但对于新的 android 版本。

【问题讨论】:

    标签: android account accountmanager


    【解决方案1】:

    一般来说,不,您无法在较新的设备上以编程方式访问其他应用的帐户。

    根据API 26 Behavior changes

    在 Android 8.0(API 级别 26)中,应用无法再获得对用户帐户的访问权限,除非身份验证器拥有帐户或用户授予该访问权限。GET_ACCOUNTS 权限不再足够.要获得对帐户的访问权限,应用程序应使用 AccountManager.newChooseAccountIntent() 或特定于身份验证器的方法。获得帐号访问权限后,应用可以拨打AccountManager.getAccounts()访问帐号。

    因此,您应该明确要求用户使用newChooseAccountIntent()(可回溯到 API 14 的 API)选择一个帐户,以便用户可以让您专门访问他们希望为您的应用提供的帐户。

    如同一页所述,new AccountManager APIs 允许拥有帐户的特定应用控制是否对任何其他应用隐藏帐户或向任何其他应用显示帐户。这或许可以解释为什么您可以访问您之前能够获得的部分内容。

    【讨论】:

    • or an authenticator-specific method. 是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 2022-09-23
    • 2019-12-02
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多