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線程上。 –

相關問題