2011-05-14 103 views
2

我正在使用新的API工作在谷歌任務應用程序,但我無法獲得授權的工作。我使用了Android的AccountManager得到一個包含authToken,奇怪的是我得到一個錯誤,說明我使用錯誤的憑據:AccountManager似乎返回錯誤authToken

{ 
    "error": { 
     "errors": [ 
      { 
       "domain": "global", 
       "reason": "invalid", 
       "message": "Invalid Credentials", 
       "locationType": "header", 
       "location": "Authorization" 
      } 
     ], 
     "code": 401, 
     "message": "Invalid Credentials" 
    } 
} 

我的代碼:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    transport = AndroidHttp.newCompatibleTransport(); 
    transport.defaultHeaders = new GoogleHeaders(); 

    gotAccount(false); 
} 

private void authenticated(String authToken) { 
    ((GoogleHeaders) transport.defaultHeaders).setGoogleLogin(authToken); 
    Tasks service = new Tasks(transport, new GsonFactory()); 

    try { 
     TaskLists taskLists = service.tasklists.list().execute(); 
    } catch (Exception e) { 
     handleException(e); 
    } 

} 

private void gotAccount(final AccountManager manager, final Account account) { 
    new Thread() { 

     @Override 
     public void run() { 
      try { 
       final Bundle bundle = manager.getAuthToken(account, AUTH_TOKEN_TYPE, true, 
         null, null).getResult(); 
       runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         if (bundle.containsKey(AccountManager.KEY_INTENT)) { 
          Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT); 
          int flags = intent.getFlags(); 
          flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK; 
          intent.setFlags(flags); 
          startActivityForResult(intent, REQUEST_AUTHENTICATE); 
         } else if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) { 
          authenticated(bundle.getString(AccountManager.KEY_AUTHTOKEN)); 
         } 
        } 

       }); 
      } catch (Exception e) { 
       handleException(e); 
      } 
     }; 
    }.start(); 
} 

private void gotAccount(boolean tokenExpired) { 
    AccountManager manager = AccountManager.get(this); 
    Account account = manager.getAccountsByType("com.google")[0]; 
    if (tokenExpired) { 
     manager.invalidateAuthToken("com.google", mAuthToken); 
    } 
    gotAccount(manager, account); 
} 

我已經試圖使用HttpRequestInitializer,並在HttpExecuteInterceptor中應用authToken,而不是使用(不建議使用的)HttpTransport.defaultHeaders,但這也不起作用。

new Tasks(transport, initializer, new GsonFactory()); 

我在做什麼錯?我的憑據顯然是正確的,GMail工作正常。

回答

2

我發現問題:我使用的是authTokenType goanna_mobile,這是我在另一個應用程序中發現的。即使AccountManager要求我允許我的應用程序訪問Google Tasks,它也是錯誤的authTokenType。

對於Google日曆,正確的是cl