【问题标题】:AccountManagerFuture issueAccountManager 未来问题
【发布时间】:2018-03-01 05:23:16
【问题描述】:

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

        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:在 android.accounts.AccountManager$AmsTask.internalGetResult(AccountManager.java:1985) W / System.err:在 android.accounts.AccountManager$AmsTask.getResult(AccountManager.java:1997) W / System.err:在 android.accounts.AccountManager$AmsTask.getResult(AccountManager.java:1995) W / System.err:在 com.fr.apps.cliente.tv.task.LoginTask.doInBackground(LoginTask.java:83) W / System.err:在 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:在 java.util.concurrent.FutureTask.run(FutureTask.java:237) W/System.err: 在 android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) W / System.err:在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) W / System.err:在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) W/System.err:在 java.lang.Thread.run(Thread.java:761)

【问题讨论】:

  • 我认为结果为空。所以它停在那里。
  • 但是bundleAccountManagerFuture有账号,不是空的
  • 但是你想展示什么?它只会执行那段代码
  • 我要检索捆绑结果的令牌:authToken = result.getString(AccountManager.KEY_AUTHTOKEN);

标签: java android token account


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    这个 * 调用将阻塞,直到结果可用。为了检查结果是否 * 无阻塞可用,可以调用 {@link #isDone()} 和 {@link #isCancelled()}。

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

    【讨论】:

    • bundleAccountManagerFuture.isDone() 和 bundleAccountManagerFuture.isCancelled() 为假。我必须做什么?
    • 您可以使用超时,这是此功能的另一个变体。使用此方法后,您必须检查它是否已完成。然后据此处理。它会防止程序卡在这个语句上。
    • 我设置了超时,现在抛出 catch (OperationCanceledException e) {
    • @Patrick 您收到有关此异常的消息是什么?此异常的原因可能有很多。您可能没有 OAuth 范围的所有权限,您的身份验证代码可能错误,您正在修改您不允许的帐户,等等。
    • @Patrick 我认为这与您的身份验证令牌有关。您确定您正确获得了身份验证令牌吗?也看看这个问题 - stackoverflow.com/questions/6116987/…
    【解决方案3】:

    我发现了问题:

    我的应用程序的包名与我的其他应用程序的包名不完全匹配(这个应用程序有登录名)。现在,我用相同的密钥签署了两者。

    【讨论】:

      猜你喜欢
      • 2020-12-31
      • 2020-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多