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