账户管理器在索尼XZ 7.1.1上无法添加账户

7
我目前正在开发的应用在索尼手机升级到7.1.1后出现问题。在索尼XZ上,当我们尝试addAccountExplicitly时,在日志中可以看到以下信息:AccountManagerService(1503): insertAccountIntoDatabase: Account {name=something@something.com, type=com.myapplication.go},由于帐户已经存在,因此跳过。该应用程序在升级之前已安装并添加了该帐户。似乎该帐户未被完全删除或重新添加。 我们如何在应用程序中恢复?为什么会这样?我已经阅读了有关Nougat预览中类似问题的文章,但是我们不能像下面的链接建议的那样通过removeAccountExplicitly然后再次添加来恢复。结果与上述相同,卸载应用程序不清除帐户,电话重启也不行。 AccountManager在Android N preview中无法添加自定义帐户
2个回答

6
我们找到了问题的可能原因和解决方法。
症状:
简而言之,这是索尼的问题。从我们的用户群中看来,只有在升级设备到7.1.1之前使用过我们的应用程序的索尼XZ用户才会受到影响。
我们甚至购买了几台索尼XZ设备(最终将它们退回商店),将它们从Android 6.0升级到7.1.1并尝试重现问题。但是我们没有成功。
然而,我们发现了另一种使用Android模拟器实现相同“症状”的方法。步骤如下:
1. 启动模拟器 2. 登录您的应用程序(以便用户添加到AccountManager) 3. 转到终端,并执行以下操作
步骤:
adb shell
su
cd /data/system_de/0/
rm accounts_de.db
  1. 重新启动你的模拟器
  2. 从现在开始,你的问题可以被重现。

此外,如果你检查/data/system_ce/0/accounts_ce.db,你会发现这是一个仍然包含你之前用户的数据库。这很可能是为什么AccountManager不允许你再次插入相同的用户。

看起来,在更新到安卓7.1.1版本时,Sony某种程度上破坏了原始帐户所在的accounts_de.db

解决方法

由于已经存在具有相同名称的帐户(而且你无法真正地从中删除它),我们基本上无法再次插入相同用户名的用户。但是,我们可以插入稍微更新了用户名的帐户:

if (!accountManager.addAccountExplicitly(account, password, bundle)) {
    // We failed to add the account. Fallback to workaround.
    accountManager.addAccountExplicitly(
        new Account(username + "\n", accountType), // this line solves the issue
        password,
        bundle
    );
}

由于这个账户现在已经与原始账户不同(感谢 \n 字符),因此它可以被插入到 AccountManager 数据库中。


2
我能够重现这个问题。但是 "\ n" 后缀应该只用作后备,如果正常方式添加帐户失败,对吧?否则,尚未更新设备到 Android 7.1.1 的用户将再次面临同样的问题。 - Mauin
2
@Mauin 是的,如果 addAccountExplicitly 返回 false,我们才会添加 "\n"。 - Dmitry Zaytsev
1
@DmitryZaytsev 旧账户是否仍可通过调用accountManager.getAccountsByType()访问?或者它在所有意义上都是隐藏的,但仍然阻止添加新账户? - Nicholas
@DmitryZaytsev 谢谢!以防万一其他人在搜索此问题时,这已发生在我们的某个用户身上,此后他们清空了 Google Play 服务数据。 - Nicholas

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接