无法从不同的应用获取AuthToken自定义帐户

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

在此处输入图像描述

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

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

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

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

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

    我使用此方法而不是之前的方法,现在我看到确认对话框:

     accountManager.getAuthToken(account, AUTH_TOKEN_TYPE_FULL_ACCESS, null, true, new AccountManagerCallback() { @Override public void run(AccountManagerFuture future) { try { Bundle bundle = future.getResult(); String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN); } catch (OperationCanceledException | IOException | AuthenticatorException e) { } } }, null); 

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

    这里有几件事要做。 在Android中使用线程通常被认为是不好的做法,根据Android文档,建议使用Async任务或Handler。 现在,对于每个Android文档的Auth消息,预期输出是通知。

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

    获取特定帐户的指定types的身份validation令牌,如果用户必须输入凭据,则可选择提出通知。

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

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

     AccountManagerFuture 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