7

我有两个应用程序使用同一个帐户类型。我想页面下方,当用户打开了第一次,第二应用程序中显示,一个帐户存在:无法从不同的应用程序为自定义帐户获取AuthToken

enter image description here

但是当我运行这段代码什么也没有发生:

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时看到授权许可页面(上图),而不是点击通知。我怎样才能做到这一点?

回答

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

+0

AUTH_TOKEN_TYPE_FULL_ACCESS的值是什么?它是“完全访问”,在我的情况下,当应用程序安装第一次然后屏幕上方显示,但没有发生任何事情后 –

0

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

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线程上调用了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 
+0

此外,请考虑尝试回调参数,以便您可以测试以查看天气回调会为您提供您正在查找的消息。回调很重要,因为它告诉你什么时候你的进程完成了,即使它在另一个线程上。这将允许您(或Android系统)根据结果显示UI提示,就像您正在尝试执行的操作一样。 –

+0

我测试了你的解决方案,但在调用'getAuthToken'后没有发生任何事情。回调里面的run方法永远不会被调用。 –

+0

我不认为你是理解的,这里没有足够的代码来尝试测试你的具体情况。为了得到你想要的东西,你必须在UI线程上做到这一点。您可以a)在UI线程上运行整个操作,这将会容易得多,或者b)使用处理程序并等待回调来显示消息。我假设这条消息是一个内置的Android消息,所以你只需要希望它会在回调中为你做,否则你就会停留在UI线程上。 –

相关问题