getAccountsByType("com.google")无法列出我的Google帐户minSdkVersion 21和targetSdkVersion 27

Dav*_*ers 5 android kotlin android-permissions

文档我试图让Google Account我的Nexus电话:

val am: AccountManager = AccountManager.get(this)
val myAccounts: Array<Account> = am.getAccountsByType("com.google")
Run Code Online (Sandbox Code Playgroud)

即使我肯定有一个帐户,并且可以看到引用它的日志,例如I/TrustAgent: [HomeAddressChangeTracker] fetch for account myaddress@gmail.comAND我已经添加了权限并验证了它们被授予,但数组始终为空.

我有minSdkVersion 21targetSdkVersion 27

有任何想法吗?

msb*_*bit 6

根据8.0 中的更改,仅凭权限无法访问帐户GET_ACCOUNTS。您还需要要求用户选择一个帐户,AccountManager.newChooseAccountIntent如下所示:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    if(checkSelfPermission(Manifest.permission.GET_ACCOUNTS) == PackageManager.PERMISSION_GRANTED) {
        val intent = AccountManager.newChooseAccountIntent(null, null, arrayOf("com.google"), null, null, null, null)
        startActivityForResult(intent, 42)
    }
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    if (requestCode == 42) 
        val accountManager = AccountManager.get(this)
        val accounts = accountManager.getAccountsByType("com.google")
        accounts.forEach {
            Log.v(localClassName, it.toString())
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

正如文档中所述AccountManager.newChooseAccountIntent

所选帐户对调用者标记为 VISIBILITY_USER_MANAGED_VISIBLE(请参阅 setAccountVisibility(Account, String, int)),并将在后续的 getAccountsByType(String))调用中返回给该帐户。

因此您只需选择该帐户一次,然后系统应该记住此选择以供后续调用AccountManager.getAccountsByType