我有 2 个独立的 Android 项目,一个是 AbstractAccountAuthenticator 的实现,用于管理设备中的用户帐户,另一个是应该从 AccountAuthenticator 获取令牌并使用它的推送应用程序。
AbstractAccountAuthenticator 的实现正在工作并在从“设置”菜单中的“帐户和同步”部分调用它时添加帐户,但是当我从推送应用程序调用 addAccount() 时,我得到一个“权限被拒绝:checkComponentPermission()”和应用程序死在那里。
我无法提供很多源代码,因为我无权允许它公开,但我向您保证它们以“独立”的方式工作。
我已经从不同的应用程序中搜索了正确使用 AccountManager 的示例,但没有找到。freenode 也没有运气。
我发现从 AccountAuthenticator 中启动活动(使用 Intent.FLAG_NEW_TASK 和 context.startActivity(intent))可以解决问题,但这意味着 addAccount() 不会返回到 AccountManager,我认为不会与开发指南保持一致,因为它打破了 AccountManager 的使用流程。另一种方法是导出请求用户凭据时使用的 Acitivity。但我认为这可能是一个安全问题,因为它应该由 AccountManager 而不是外部调用。
感谢您对此提出的任何想法。
PS:
所有权限都正确使用,除非我需要一个我不知道的特殊权限才能跨应用程序工作。
我会问我是否可以使用代码片段在这里显示我关心的行。
在这里发布的第一个问题,我希望我没有在这里违反(m)任何规则(我在这里和谷歌上进行了搜索,但我问了,因为我没有发现任何用处。)
谢谢你。
在深入研究了谷歌的登录服务并偶然发现了设置类之后,我发现了我认为应该是解决方案:
不要导出东西,我一直认为绕过AccountManager调用你的实现,成为服务或活动是一个安全问题。
不要在你的实现上使用
Intent.FLAG_NEW_TASK
and ,因为它可能会让你出现意想不到的行为。startActivity()
AbstractAccountAuthenticator
这样做的方法很简单,实际上:
Intent i = new Intent( Settings.ACTION_ADD_ACCOUNT );
i.putExtra( Settings.EXTRA_AUTHORITIES, new String[] { "com.exaple.yourauth" } );
contextVar.startActivity( i );
这样,您要求设置为新帐户(bus)提出可能的权限列表,因为您要添加 EXTRA_AUTHORITIES 参数,这是一个带有要显示的权限的字符串,它将选项限制为您想要的。如果只有一个与您的额外匹配,则以适当的方式调用帐户管理器和登录活动。
我真的希望这可以帮助周围的任何其他人。