我的应用程序使用 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 应用程序:
- https://github.com/googlesamples/android-testdpc
- https://github.com/googlesamples/android-BasicSyncAdapter
以下是重现抛出上述异常的步骤:
- 恢复出厂设置并等待开箱即用屏幕出现。
- 安装应用程序 android-testdpc。为 Android for Work 托管配置文件完成设备设置。
- 不要更改任何策略,也不要重新启动设备。
- 安装应用程序 android-BasicSyncAdapter 并启动它。
- 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 而不必先重新启动设备。