Android 8.0 ---AccountManager之行为变更

这周有同事反馈在Android 8.0上获取不到帐号,第一反应就是去看源码了,没想起来先看下官方文档哈哈。。。由于自己的理解误区,还是走了点弯路,但幸运的是最终搞清了获取帐号的整个流程

接下来说的是获取帐号的权限变更:

//获取帐号列表/或对应帐号类型的某个帐号
AccountManager#getAccounts()/getAccountsByType(String accountType)

但是你的工程运行在Android 8.0(sdk version 为26)的机器上,可获取到帐号的情况(满足任一条件即可)

  1. Target API level below O and have deprecated GET_ACCOUNTS permission.
  2. Have GET_ACCOUNTS_PRIVILEGED permission.
  3. Have the same signature as authenticator.
  4. Have READ_CONTACTS permission and account type may be associated with contacts data - (verified by WRITE_CONTACTS permission check for the authenticator).

第一种情况:

targetSdkVersion<26,判断逻辑和8.0之前的判断逻辑是一样的,会检查Manifest.permission.GET_ACCOUNTS的权限(android6.0及以上是运行时权限,需动态申请)

第二种情况:

有权限Manifest.permission.GET_ACCOUNTS_PRIVILEGED,只有priv/app目录下的app声明之后才会授予此权限 (不管targetSdkVersion<26,还是>=26,有此权限,都有getAccountsXXX的权限 )

第三种情况:

和注册此帐号类型的authenticator app签名一致(同第二种情况,与targetSdkVersion无关,只要签名一致,即可在8.0的机器上有权限调用getAccountsXXX)

第四种情况:

caller app有权限Manifest.permission.READ_CONTACTS,该accountType的authenticator app要有Manifest.permission.WRITE_CONTACTS(这两个都是dangerous permission,需要动态申请)
根据Requesting Permissions才发现,read contacts,write contacts和get account这三个权限是属于同一个权限组的
这里写图片描述

其他解决方案

如果上面四个条件你都不满足,AccountManager还提供里另外两个接口:


/**
* 返回用户选择授予获取帐号的弹窗Intent
*/
static public Intent newChooseAccountIntent(Account selectedAccount,
ArrayList<Account> allowableAccounts, 
String[] allowableAccountTypes, 
String descriptionOverrideText, 
String addAccountAuthTokenType, 
String[] addAccountRequiredFeatures,
Bundle addAccountOptions)
/**
* 将某个帐号对特定包名可见性(允许/拒绝)
* 只有和account的authenticator app签名一致才能调用此接口
*/
public boolean setAccountVisibility(Account account, String packageName, @AccountVisibility int visibility)
/**
* 此外,android8.0还追加下面接口,与setAccountVisibility接口相同
* 在登录成功,向AccountManager数据库中添加帐号时添加对特定包名的可见性
* 名义上,只有authenticator app才可以调用此接口
*/
public boolean addAccountExplicitly(Account account, String password, Bundle extras, Map<String, Integer> visibility) 

上述接口要么是用户来选择授权同意,要么是authenticator app给予授权,具体来说Android 8.0更加加强了用户的隐私数据安全性

newChooseAccountIntent显示给用户的弹窗样式如下:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/dzkdxyx/article/details/78821384