7

我有两个使用相同帐户类型的应用程序。我希望在用户第一次打开第二个应用程序并且存在一个帐户时显示以下页面:

在此处输入图像描述

但是当我运行这段代码时没有任何反应:

final AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, authTokenType, null, this, null, null);

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Bundle bnd = future.getResult();

            final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN);
            showMessage((authtoken != null) ? "SUCCESS!\ntoken: " + authtoken : "FAIL");
            Log.d("udinic", "GetToken Bundle is " + bnd);
        } catch (Exception e) {
            e.printStackTrace();
            showMessage(e.getMessage());
        }
    }
}).start();

当我从具有身份验证器的应用程序运行上面的代码时,它可以正常工作。当我运行下面的代码时,系统会生成一个通知,当我点击它时,会出现上图。

final AccountManagerFuture<Bundle> future = mAccountManager
        .getAuthToken(account, authTokenType, null, true,
                null, handler);

单击允许按钮返回AuthToken正确。但是,我想在调用时查看授予权限页面(上图)getAuthToken,而不是通过单击通知。我怎样才能做到这一点?

4

2 回答 2

1

我使用了这种方法而不是以前的方法,现在我看到了确认对话框:

accountManager.getAuthToken(account, AUTH_TOKEN_TYPE_FULL_ACCESS, null, true, new AccountManagerCallback<Bundle>() {
            @Override
            public void run(AccountManagerFuture<Bundle> future) {
                try {
                    Bundle bundle = future.getResult();
                    String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);

                } catch (OperationCanceledException | IOException | AuthenticatorException e) {

                }
            }
}, null);

请注意,第二个应用程序必须具有不同的签名。如果两个应用程序具有相同的签名,则无需确认并authToken会检索。

于 2016-06-01T12:08:56.503 回答
0

有几件事要过去。在 Android 中使用线程通常被认为是不好的做法,根据 Android 文档,建议使用异步任务或处理程序。现在对于每个 Android 文档的 Auth 消息,预期的输出是一个通知。

getAuthToken(Account account, String authTokenType, Bundle options, boolean notifyAuthFailure, AccountManagerCallback<Bundle> callback, Handler handler)

获取特定帐户的指定类型的身份验证令牌,如果用户必须输入凭据,则可以选择发出通知。

注意 getAuthToken 有一个 Handler 参数吗?这将是处理异步任务的首选方法。这里的问题是you CAN NOT have a full screen message on a handler thread, because it can't interrupt the UI thread.在您的第一个示例中,您实际上在 UI 线程上调用 call mAccountManager,因此它允许它接管 UI 并发送全屏允许或拒绝消息,但是这不能通过处理程序完成,因为处理程序无法使用UI 线程(将在运行时抛出错误)。

我提出的解决方案?如果您想要全屏中断消息,请不要使用处理程序,请在 UI 线程上执行操作,类似于您的第一个代码片段。

AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, authTokenType, null, this, callback, null); 
//USE implements and implement a listener in the class declaration and 
//use 'this' in the callback param OR create a new callback method for it
于 2015-09-15T02:25:31.543 回答