1

我的应用程序使用 SyncAdapters 在后台同步数据。在运行 OS 8.0 并设置 Android for Work 托管配置文件的设备上,调用 addAccountExplicitly 会引发 SecurityException 并且无法正确添加帐户。

这是调用堆栈:

11-28 17:28:00.182 7291-7291/com.example.android.basicsyncadapter E/CreateSyncAccount: Failed
   java.lang.SecurityException: com.google.android.gm from uid 10074 not allowed to perform GET_ACCOUNTS
      at android.os.Parcel.readException(Parcel.java:1942)
      at android.os.Parcel.readException(Parcel.java:1888)
      at android.accounts.IAccountManager$Stub$Proxy.addAccountExplicitly(IAccountManager.java:1205)
      at android.accounts.AccountManager.addAccountExplicitly(AccountManager.java:875)
      at com.example.android.basicsyncadapter.SyncUtils.CreateSyncAccount(SyncUtils.java:58)
      at com.example.android.basicsyncadapter.EntryListFragment.onAttach(EntryListFragment.java:148)

我使用在 Pixel 上运行 8.0 的两个 GitHub 项目重现了失败:fingerprint=google/marlin/marlin:8.0.0/OPR3.170623.013/4397526:user/release-keys

GitHub 应用程序:

  1. https://github.com/googlesamples/android-testdpc
  2. https://github.com/googlesamples/android-BasicSyncAdapter

以下是重现抛出上述异常的步骤:

  1. 恢复出厂设置并等待开箱即用屏幕出现。
  2. 安装应用程序 android-testdpc。为 Android for Work 托管配置文件完成设备设置。
  3. 不要更改任何策略,也不要重新启动设备。
  4. 安装应用程序 android-BasicSyncAdapter 并启动它。
  5. Logcat 将捕获

我是崩溃:[7489,0,com.example.android.basicsyncadapter,950582854,java.lang.SecurityException,com.google.android.gm from uid 10075 not allowed to perform GET_ACCOUNTS,Parcel.java,1942]

补充说明:

  • 我看到仅在具有 Android 8.0 的设备上引发了 SecurityException。
  • 在启动 android-BasicSyncAdapter 之前重新启动设备不会导致抛出 SecurityException。目前建议为用户解决。

我试图弄清楚如何成功调用 addAccountExplicitly 而不必先重新启动设备。

4

1 回答 1

0

我的 Google Pixel 设备收到了我安装的 8.1 更新。使用两个应用程序重新测试:

  1. https://github.com/googlesamples/android-testdpc
  2. https://github.com/googlesamples/android-BasicSyncAdapter

然后按照重现的步骤,不再抛出 SecurityException。

为了验证不是为了解决问题而更改的测试应用程序,我用指定的 8.0 ROM 映像刷新了我的 Pixel 设备。重新测试并以相同的方式抛出 SecurityException。

该问题似乎在 OS 版本 8.0 之后得到修复。

于 2018-02-15T20:04:55.847 回答