获取所有类型的账户Android API 29

Get all types of accounts Android API 29

我是 android 的新手,正在尝试获取 android 用户在 his/her 设备中注册的帐户列表。我使用 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 使用相同的代码时,它不会 return 第三方帐户,如 com.twitter.android.auth.logincom.facebook.auth.login,以及 "com.linkedin.android。但是,我可以看到在设备上登录的 gmail 帐户。我怎样才能在最近的 android 版本中检索此信息?

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

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

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

根据 API 26 Behavior changes:

In Android 8.0 (API level 26), apps can no longer get access to user accounts unless the authenticator owns the accounts or the user grants that access. The GET_ACCOUNTS permission is no longer sufficient. To be granted access to an account, apps should either use AccountManager.newChooseAccountIntent() or an authenticator-specific method. After getting access to accounts, an app can can call AccountManager.getAccounts() to access them.

所以你应该特别要求用户select一个使用newChooseAccountIntent()的帐户(一个API可用回到API14)这样用户就可以给您可以专门访问他们希望为您的应用提供的帐户。

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