AccountManagerFuture问题

时间:2017-09-20 08:35:07

标签: java android token account

我想要检索用户令牌。 这是我的代码:

        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();

有些想法?

非常感谢

例外:

  

android.accounts.OperationCanceledException W / System.err:at   android.accounts.AccountManager $ AmsTask.internalGetResult(AccountManager.java:1985)   W / System.err:at   android.accounts.AccountManager $ AmsTask.getResult(AccountManager.java:1997)   W / System.err:at   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:在android.os.AsyncTask $ 2.call(AsyncTask.java:304)   W / System.err:at   java.util.concurrent.FutureTask.run(FutureTask.java:237)W / System.err:   在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 个答案:

答案 0 :(得分:0)

使用getResult()尝试调用变量,代码立即继续。我假设你试图从服务器或其他东西中检索它,而不是存储在设备上?在这种情况下,您需要等待.isDone()(android doc here)在处理结果之前变为true。

答案 1 :(得分:0)

来自AccountManagerFuture方法的.getResult()文档 -

:此      *呼叫将阻止,直到结果可用。为了检查结果是否正确      *可以无阻塞地使用,可以拨打{@link #isDone()}和{@link #isCancelled()}。

编辑1:您可以使用getResult(long timeout, TimeUnit unit),如果请求被阻止,它将在指定时间后超时。在此之后,您可以使用.isDone()检查任务是否成功完成,然后继续。

答案 2 :(得分:0)

我发现了问题:

我的应用程序的软件包名称与我的其他应用程序的软件包名称不完全匹配(此应用程序具有登录名)。现在,我用相同的密钥签名。