欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 8.0 ---AccountManager之行为变更

程序员文章站 2022-03-13 20:55:05
...

这周有同事反馈在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这三个权限是属于同一个权限组的
Android 8.0 ---AccountManager之行为变更

其他解决方案

如果上面四个条件你都不满足,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显示给用户的弹窗样式如下:
Android 8.0 ---AccountManager之行为变更

相关标签: android acccount