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

nhe*_*121 3 account android accountmanager

我是 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);

        }
Run Code Online (Sandbox Code Playgroud)

例如,上面的代码可以按照 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"}]
Run Code Online (Sandbox Code Playgroud)

请注意,我可以检测用户是否登录了第三方应用程序。我确实安装了 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 版本。

ian*_*ake 6

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

根据API 26 行为更改

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

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

正如同一页面提到的,有新的 AccountManager API允许拥有帐户的特定应用程序控制是向任何其他应用程序隐藏帐户还是向任何其他应用程序显示帐户。这可以解释为什么您可以访问之前能够获得的某些内容的子集。