我想检索用户令牌 . This is my code:
AccountManager am = AccountManager.get(mActivity);
AccountManagerFuture<Bundle> bundleAccountManagerFuture = am.getAuthTokenByFeatures(ACCOUNT_TYPE, AUTHORIZATION_TOKEN_TYPE, null, mActivity, null, null, null, null);
try {
Bundle result = bundleAccountManagerFuture.getResult(30, TimeUnit.SECONDS);
if (result!=null) {
OTTCache.getInstance().authToken = result.getString(AccountManager.KEY_AUTHTOKEN);
}
} catch (OperationCanceledException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (AuthenticatorException e) {
e.printStackTrace();
}
但是这个过程停止在这一行:
Bundle result = bundleAccountManagerFuture.getResult();
有些想法?
非常感谢你
Exception:
android.accounts.OperationCanceledException W / System.err:在android.accounts.AccountManager $ AmsTask.internalGetResult(AccountManager.java:1985)W / System.err:at android.accounts.AccountManager $ AmsTask.getResult(AccountManager.java: 1997)W / System.err:在android.accounts.AccountManager $ AmsTask.getResult(AccountManager.java:1995)W / System.err:at com.fr.apps.cliente.tv.task.LoginTask.doInBackground(LoginTask . java:83)W / System.err:at com.fr.apps.cliente.tv.task.LoginTask.doInBackground(LoginTask.java:25)W / System.err:at android.os.AsyncTask $ 2.call(AsyncTask .java:304)W / System.err:at java.util.concurrent.FutureTask.run(FutureTask.java:237)W / System.err:at android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java: 243)W / System.err:at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)W / System.err:at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:607) W / System.err:at java.lang.Thread.run(Thread.java:761)
3 回答
使用getResult()尝试调用变量,代码立即继续 . 我是否试图从服务器或其他东西中检索它,而不是存储在设备上?在这种情况下,您需要等待.isDone()(android doc here)在处理结果之前变为true .
来自
AccountManagerFuture
的文档.getResult()
方法 -This * call will block until the result is available. In order to check if the result is * available without blocking, one may call {@link #isDone()} and {@link #isCancelled()}.
EDIT 1: 您可以使用
getResult(long timeout, TimeUnit unit)
,如果请求被阻止,它将在指定时间后超时 . 在此之后,您可以使用.isDone()
检查任务是否成功完成,然后继续 .我发现了问题:
我的应用程序的程序包名称与我的其他应用程序的程序包名称不完全匹配(此应用程序具有登录名) . 现在,我用相同的密钥签名 .