11

我正在嘗試使用Android應用程序訪問Gmail API。 我已經使用所有可用的範圍組合成功請求並接收了一個訪問令牌。 但似乎每一次我真正嘗試使用Gmail API命令我得到一個403 exception reading: Access not configured please use Google developers console to activate the api...使用Android的Gmail API訪問

不用多說了API被激活和客戶端密鑰,用正確的軟件包名稱& SHA1代碼創建的。相同的客戶端ID與Google Plus功能配合良好。

任何有此問題或成功連接到Android的Gmail api的人?

感謝

這裏的日誌:

09-04 21:40:54.014: W/System.err(26717): com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden 
09-04 21:40:54.014: W/System.err(26717): { 
09-04 21:40:54.014: W/System.err(26717): "code" : 403, 
09-04 21:40:54.014: W/System.err(26717): "errors" : [ { 
09-04 21:40:54.014: W/System.err(26717):  "domain" : "usageLimits", 
09-04 21:40:54.014: W/System.err(26717):  "message" : "Access Not Configured. Please use Google Developers Console to activate the API for your project.", 
09-04 21:40:54.014: W/System.err(26717):  "reason" : "accessNotConfigured" 
09-04 21:40:54.014: W/System.err(26717): } ], 
09-04 21:40:54.014: W/System.err(26717): "message" : "Access Not Configured. Please use Google Developers Console to activate the API for your project." 
09-04 21:40:54.014: W/System.err(26717): } 

是否有需要在API控制檯啓用Google+的除外API和Gmail API的任何其他的API?

編輯:

我發現,使用基於WebView認證將導致一個訪問令牌,將授予Gmail的API訪問但這不是一個有效的解決方案,因爲令牌短暫的。至於GoogleAuthUtil現在將授予令牌,但它的權限不足以使用Gmail API。 任何人都可以成功地將Android與Gmail API連接,並希望分享?

EDIT2:

下面是摘錄我在做什麼:

獲取令牌:

token = GoogleAuthUtil.getToken(MainActivity.this, Plus.AccountApi.getAccountName(mGoogleApiClient), scope); 

嘗試獲取來自Gmail的API消息:

GoogleCredential credential = new GoogleCredential().setAccessToken(token); 
JsonFactory jsonFactory = new JacksonFactory(); 
HttpTransport httpTransport = new NetHttpTransport(); 

service = new Gmail.Builder(httpTransport, jsonFactory, credential).setApplicationName("GmailApiTP").build(); 
ListMessagesResponse messagesRespose; 
List<Message> m = null; 

ArrayList<String> ids = new ArrayList<String>(); 
ids.add("INBOX"); 
try { 
    messagesRespose = service.users().messages().list("me").setLabelIds(ids).setQ("From: something") 
      .execute(); 
    m = messagesRespose.getMessages(); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

使用Gmail API服務時會發生異常。此外,我試圖清除令牌並要求有相同結果的新令牌。

+0

您是否嘗試實施此示例(https://developers.google.com/gmail/api/quickstart/quickstart-java#step_1_enable_the_gmail_api)? – 2014-09-13 06:12:54

+0

是的。這很簡單。但仍然無法解釋爲什麼GooglaApiCient會返回不可用的令牌。 – TalMihr 2014-09-18 22:06:34

+0

就像一個數據點一樣,'GoogleAuthUtil'對我使用Gmail API從Jelly Bean和KitKat上的服務發送電子郵件的工作正常。我直接使用REST API(即通過'HttpURLConnection')而不是Java客戶端庫,但這應該獨立於令牌獲取。我得到了你的403一段時間,直到我正確設置了Android應用程序的客戶端ID,但在此之後自動刷新處理就沒問題了。一個可能出錯的地方是你沒有顯示的是在'getToken()'調用中處理'UserRecoverableAuthExtension'。 – rhashimoto 2014-10-25 00:54:15

回答

3

該錯誤消息具有欺騙性,我相信當開發人員項目憑據客戶端不正確時也會發生這種情況。例如,當你真的想要「已安裝的應用程序」時,你選擇了「Web應用程序」。

確認你正確地從如下的說明: https://developers.google.com/accounts/docs/OAuth2

(應該是「安裝的應用程序」等)

你能後你從開發商控制檯有OAuth客戶端的信息? (類型和任何其他非機密信息等)

+0

後,我應該做些什麼更深的鏈接創建已安裝的應用程序(android)。 Sha1和包驗證。相同的客戶端ID與Google plus API配合良好。感覺這個API沒有被設計爲與Android交談 – TalMihr 2014-09-04 16:57:45

+0

API是客戶端/平臺不可知論的,它應該在Android以及任何其他Google API上工作。不知道這裏有什麼問題,希望看到google-oauth或google-oauth-java-client標籤的人可以提供一些見解。 – 2014-09-04 18:20:59

+0

謝謝。我不斷嘗試弄清楚什麼是錯的。問題是,我沒有看到許多Gmail API Android用戶對獲得其工作的人獲得良好反饋。 – TalMihr 2014-09-04 18:36:55

-2

那麼這裏的交易。到目前爲止GoogleAuthUtil給出的令牌& & AccountManager不適用於Gmail API。不知道這是不是谷歌的事情,但我的解決方案是這樣的:

在API控制檯中創建一個客戶端ID(應用程序 - >其他)。 使用客戶端ID &客戶端密鑰通過WebView獲取訪問令牌。 保存結果刷新令牌。 現在,每當要刷新訪問令牌使用這個請求:

httpClient = new DefaultHttpClient(); 
    httpPost = new HttpPost(address); 
    params.add(new BasicNameValuePair("refresh_token", token)); 
    params.add(new BasicNameValuePair("client_id", client_id)); 
    params.add(new BasicNameValuePair("client_secret", client_secret)); 
    params.add(new BasicNameValuePair("grant_type", "refresh_token")); 
    httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); 
    httpPost.setEntity(new UrlEncodedFormEntity(params)); 
    HttpResponse httpResponse = httpClient.execute(httpPost); 
    HttpEntity httpEntity = httpResponse.getEntity(); 
    is = httpEntity.getContent(); 

爲我工作。希望將來可以通過GoogleAuthUtil.getToken()選項提供有效的令牌。

+0

除了使用webview以外沒有其他選擇嗎? – 2016-10-20 00:44:49

5

儘管沒有清楚描述,但問題是通過GoogleAuthUtil.getToken()獲得的令牌會在本地緩存並可能過期。您收到的403錯誤是由於過期的令牌造成的。處理這種情況的正確方法是調用GoogleAuthUtil.clearToken()刪除本地緩存的令牌,然後調用GoogleAuthUtil.getToken()以獲取新的令牌。

或者,您可以跟蹤上次請求令牌的時間,如果它已超過一小時(這些令牌的默認過期時間),則預先執行clearToken + getToken調用。

+0

所以我必須做一些非常錯誤的事情,因爲即使我用GoogleAuthUtil.getToken()請求一個新的令牌,然後用GoogleAuthUtil.clearToken()清除它,然後請求一個新的令牌,新的令牌仍然不起作用(403) 。 – TalMihr 2014-09-08 21:46:20

+0

您是否設法使用GoogleAuthUtil連接Gmail API?如果你能分享你的代碼,那將是可愛的。我可能完全沒有? – TalMihr 2014-09-08 21:47:10

+0

這裏有令牌的詳細信息:{ 「ISSUED_TO」: 「608941808256-43vtfndets79kf5hac8ieujto8837660.apps.googleusercontent.com」, 「觀衆」: 「608941808256-43vtfndets79kf5hac8ieujto8837660.apps.googleusercontent.com」, 「範圍」:「HTTPS: //www.googleapis.com/auth/gmail.readonly https://www.googleapis.com/auth/gmail.modify「, 」expires_in「:3589, 」access_type「:」offline「 } – TalMihr 2014-09-08 22:03:12

0

您需要在Google開發者控制檯中設置您的Android應用程序密鑰。

  1. 選擇你的項目,選擇API &驗證,然後單擊憑據
  2. 創建新的客戶端ID(儘管它有其他的客戶端ID)
  3. 選擇安裝的應用程序 - > Android的
  4. 填寫您的包名和SHA1正確
  5. 創建新的密鑰(儘管它有其他客戶端密鑰)
  6. 選擇Android的關鍵
  7. 填寫的SHA1,p ackageNameName是這樣的:45:B5:E4:6F:36:AD:0A:98:94:B4:02:66:2B:12:17:F2:56:26:A0:E0;com.example

您的問題將自動解決。確保使用調試密鑰庫和發行密鑰庫創建客戶端ID和密鑰。