我是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":"[email protected]","type":"com.google"},{"name":"[email protected]","type":"com.google"},{"name":"[email protected]","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,并且已经从设备上登录了那些平台。我只需要捕获它(如上面的列表所示),而不是实际的帐户名。
重点是,当我对29级Android API使用相同的代码时,它不会返回com.twitter.android.auth.login
,com.facebook.auth.login
和"com.linkedin.android
之类的第三方帐户。但是,我可以看到设备上已登录的gmail帐户。如何在最新的android版本中检索此信息?
我还应该说,我正在从Android模拟器运行最新的API 29,不知道这是否是原因。我在模拟器中安装了linkedin,twitter和fb,并且也在那里登录。
我只需要得到与上面显示的结果相同的结果,但对于新的android版本。
通常,不,您无法在较新的设备上以编程方式访问其他应用程序的帐户。
在Android 8.0(API级别26)中,应用程序将无法再访问用户帐户,除非身份验证者拥有帐户或用户授予该访问权限。
GET_ACCOUNTS
权限不再足够。要被授予访问帐户的权限,应用应使用AccountManager.newChooseAccountIntent()
或特定于身份验证器的方法。访问帐户后,应用程序可以调用AccountManager.newChooseAccountIntent()
来访问它们。
因此,您应该特别要求用户使用AccountManager.getAccounts()
(可从API 14重新获得的API)选择一个帐户,以便该用户可以授予您访问他们想提供给您的应用的帐户的专用权限。
如同一页面上所述,AccountManager.getAccounts()
允许拥有帐户的特定应用程序控制是否向任何其他应用程序隐藏帐户或向其他任何应用程序显示帐户。这可以解释为什么您可以访问以前获得的功能的子集。