Android 8.0 ---AccountManager之行为变更
这周有同事反馈在Android 8.0上获取不到帐号,第一反应就是去看源码了,没想起来先看下官方文档哈哈。。。由于自己的理解误区,还是走了点弯路,但幸运的是最终搞清了获取帐号的整个流程
接下来说的是获取帐号的权限变更:
//获取帐号列表/或对应帐号类型的某个帐号
AccountManager#getAccounts()/getAccountsByType(String accountType)
但是你的工程运行在Android 8.0(sdk version 为26)的机器上,可获取到帐号的情况(满足任一条件即可)
- Target API level below O and have deprecated GET_ACCOUNTS permission.
- Have GET_ACCOUNTS_PRIVILEGED permission.
- Have the same signature as authenticator.
- 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显示给用户的弹窗样式如下:
推荐阅读
-
Android 7.0行为变更 FileUriExposedException解决方案 框架
-
Android 7.0行为变更 FileUriExposedException解决方案 框架
-
Android 7.0行为变更 FileUriExposedException解决方法
-
Android 7.0行为变更 FileUriExposedException解决方法
-
粮草先行——Android折叠屏开发技术点番外篇之运行时变更处理原则
-
Android 11版本主要的行为变更
-
Android 7.0行为变更 FileUriExposedException解决方案
-
Android O新特性和行为变更总结
-
适配Android 8.0(Oreo)通知栏行为变更
-
AccountManager getAccount 在Android O 8.0版本中获取为 null ?