3

我有 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_TASKand ,因为它可能会让你出现意想不到的行为。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 参数,这是一个带有要显示的权限的字符串,它将选项限制为您想要的。如果只有一个与您的额外匹配,则以适当的方式调用帐户管理器和登录活动。

我真的希望这可以帮助周围的任何其他人。

4

1 回答 1

7

在深入研究了谷歌的登录服务并偶然发现了设置类之后,我发现了我认为应该是解决方案:

  • 不要导出东西,我一直认为绕过AccountManager调用你的实现,成为服务或活动是一个安全问题。

  • 不要在你的实现上使用Intent.FLAG_NEW_TASKand ,因为它可能会让你出现意想不到的行为。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 参数,这是一个带有要显示的权限的字符串,它将选项限制为您想要的。如果只有一个与您的额外匹配,则以适当的方式调用帐户管理器和登录活动。

我真的希望这可以帮助周围的任何其他人。

于 2013-03-25T13:11:55.530 回答