Android 在服务中等待getAuthToken意图结果
首先,动机: 我正在构建一个应用程序,它可以从通过Android 在服务中等待getAuthToken意图结果,android,android-intent,android-service,android-authenticator,Android,Android Intent,Android Service,Android Authenticator,首先,动机: 我正在构建一个应用程序,它可以从通过AccountManager获得的Android服务中获益,但并非绝对需要。在这种情况下,我构建应用程序时没有GET\u ACCOUNTS和USE\u CREDENTIALS权限,而是选择构建一个服务插件进行授权,用户可以选择安装该插件。现在,这个插件完全按照预期工作,除了一个突出的问题:我可以启动从getAuthToken(…)返回的Intent,请求初始授权,但我不能等待它完成 那么,现在已经知道为什么我要从服务调用getAuthToken(
AccountManager
获得的Android服务中获益,但并非绝对需要。在这种情况下,我构建应用程序时没有GET\u ACCOUNTS
和USE\u CREDENTIALS
权限,而是选择构建一个服务
插件进行授权,用户可以选择安装该插件。现在,这个插件完全按照预期工作,除了一个突出的问题:我可以启动从getAuthToken(…)
返回的Intent
,请求初始授权,但我不能等待它完成
那么,现在已经知道为什么我要从服务调用getAuthToken(…)
而不是从活动调用,有人知道我如何在返回令牌之前等待授权意图完成吗?基本上,在下面的代码中,是否有人知道如何在authIntent
完成之前推迟返回token
...
AccountManagerFuture<Bundle> accountManagerFuture;
accountManagerFuture = accountManager.getAuthToken(accounts[0], "android", true, null, null);
Bundle authTokenBundle = accountManagerFuture.getResult();
if (authTokenBundle.containsKey(AccountManager.KEY_AUTHTOKEN))
token = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN).toString();
else if (authTokenBundle.containsKey(AccountManager.KEY_INTENT)) {
Intent authIntent = (Intent) authTokenBundle.getParcelable(AccountManager.KEY_INTENT);
authIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(authIntent);
...
// I know that I wouldn't set token here; this is just to emphasize
// that I want to set it after authIntent completes
token = ???
}
。。。
会计经理未来会计经理未来;
accountManagerFuture=accountManager.getAuthToken(帐户[0],“android”,true,null,null);
Bundle authTokenBundle=accountManagerFuture.getResult();
if(authTokenBundle.containsKey(AccountManager.KEY\u AUTHTOKEN))
token=authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN.toString();
else if(authTokenBundle.containsKey(AccountManager.KEY_INTENT)){
Intent authIntent=(Intent)authTokenBundle.getParcelable(AccountManager.KEY\u Intent);
authIntent.addFlags(Intent.FLAG\u活动\u新任务);
背景。起始触觉(authIntent);
...
//我知道我不会在这里设置令牌,这只是为了强调
//我想在authIntent完成后设置它
令牌=???
}
另外,如果知道有任何用处,那么上面的代码位于异步任务
中。这会很难看,但也许我可以轮询getAuthToken(…)
,直到它不再返回意图为止?不过,我必须相信还有比这更好的解决方案。我肯定这不是最好的答案,但我认为它应该适合我的具体情况。即,以下约束适用:
服务
插件仅设计用于与父应用程序接口
父应用程序不会连续调用插件
由getAuthToken(…)
返回的授权Intent
很少被调用(可能只有一次)
运行来自getAuthToken(…)
的Intent
后,后续调用将返回有效令牌(如果用户授予权限)或无效令牌(如果用户未授予权限)
出现授权提示时,父应用将暂停
考虑到以上所有因素,我认为当授权提示成为焦点时,我可以在父应用程序的onPause()
中调用unbindService(…)
。授权提示完成后,我可以在onResume()
中调用bindService(…)
,然后在后续时间调用与getAuthToken(…)
关联的任务。此时,由于已应用授权提示(假设用户正常交互),父应用程序将获得(有效或无效)令牌,就好像服务
已等待意图
完成一样
我看到的这种方法的问题是,用户在没有首先终止授权的情况下带回父应用程序Intent
。我还没有测试过这个案例,但我怀疑很大程度上取决于getAuthToken(…)
如何确定何时返回意图
不管怎样,这就是我得到的。欢迎提出任何其他建议/关切