android - AccountManager 无法在 Sony XZ 7.1.1 上添加帐户

标签 android sony accountmanager android-7.1-nougat

我目前正在开发的应用程序最近在用户更新到 7.1.1 om 索尼手机时出现问题

在 Sony XZ 上,我们可以在尝试显式添加帐户时在日志中看到:

AccountManagerService( 1503): insertAccountIntoDatabase: Account {name=something@something.com, type=com.myapplication.go}, 跳过,因为该帐户已经存在

应用程序已安装,帐户已在升级前由我们的应用程序添加。似乎该帐户尚未完全删除/重新添加。

我们的应用程序如何从中恢复? 为什么会这样? 我在牛轧糖预览中读到过类似的问题,但我们无法使用 removeAccountExplicitly 从中恢复,然后按照下面链接中的建议再次添加它。结果同上,卸载应用不会清空账号,也不会重启手机。

AccountManager does not add custom account in Android N preview

最佳答案

我们找到了问题的可能原因和解决方案。

症状

TL;DR 这是索尼的错。

从我们的用户群来看,似乎只有 Sony XZ 用户在将设备升级到 7.1.1 之前使用过我们的应用。

我们甚至购买了几台 Sony 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 不允许您再次插入同一用户的原因。

看起来在更新到 Android 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 数据库中。

关于android - AccountManager 无法在 Sony XZ 7.1.1 上添加帐户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43664484/

相关文章:

android - 如何从设置 UI 中隐藏我的客户客户经理

android - 扩展一个android服务接口(interface)

java - 如何以编程方式设置相对布局中 TextViews 的对齐父右属性

android - 使用特定设备时 Logcat 不显示调试消息

android - 如何通过蓝牙唤醒处于蓝牙待机状态的设备(如 avr Sony STR-DN1080)

android - 我们如何控制 Android 同步适配器首选项?

java - 我如何从 json 获取数据到微调器?

java - 无法解析 : com. google.android.material.material :1. 0

android - 索尼智能手环 SWR10 API

android - 如何让 Android 将应用程序数据存储在用户的 Google 帐户中,以便在新设备上安装时恢复