使用Android进行Gmail API访问

时间:2014-09-04 14:31:19

标签: android google-oauth gmail-api google-schemas google-oauth-java-client

我正在尝试使用Android应用程序访问Gmail API。 我已成功请求并使用所有可用范围组合接收了访问令牌。 但似乎每次我实际尝试使用Gmail API命令时,我都会收到403 exception reading: Access not configured please use Google developers console to activate the 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): }

除了Google+ API和Gmail API之外,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服务时会捕获异常。此外,我已经尝试清除令牌并要求一个具有相同结果的新令牌。

4 个答案:

答案 0 :(得分:6)

虽然没有清楚地描述,但问题是通过GoogleAuthUtil.getToken()获得的令牌在本地缓存并且可能会过期。您收到的403错误是由于令牌过期造成的。处理这种情况的正确方法是调用GoogleAuthUtil.clearToken()删除本地缓存的令牌,然后调用GoogleAuthUtil.getToken()以获取新的令牌。

或者,您可以跟踪上次请求令牌的时间,如果它超过一小时(这些令牌的默认到期时间),请先抢先执行clearToken + getToken调用。

答案 1 :(得分:4)

该错误消息具有欺骗性,我相信当开发人员项目凭据客户端不正确时也会发生这种情况。例如,当您真正想要“安装的应用程序”时,您选择了“Web应用程序”。

确认您正确遵循以下说明: https://developers.google.com/accounts/docs/OAuth2

(应该是“已安装的应用程序”等)

您可以从开发者控制台发布您拥有的oauth客户端信息吗? (在那里输入类型和任何其他非机密信息等)

答案 2 :(得分:0)

您需要在Google Dev Console中设置Android应用密钥。

  1. 选择您的项目,选择API&amp;单击“验证”,然后单击“凭据”
  2. 创建新的客户端ID(尽管它有其他客户端ID)
  3. 选择已安装的应用 - &gt;机器人
  4. 正确填写您的包裹名称和SHA1
  5. 创建新密钥(尽管它有其他客户端密钥)
  6. 选择Android密钥
  7. 填写SHA1; packageName,如下所示:45:B5:E4:6F:36:AD:0A:98:94:B4:02:66:2B:12:17:F2:56:26:A0:E0;com.example
  8. 您的问题将自动解决。确保使用调试密钥库和发布密钥库创建客户机ID和密钥。

答案 3 :(得分:-3)

这是这笔交易。到目前为止,GoogleAuthUtil&amp;&amp; amp; AccountManager无法使用Gmail API。不知道它是否是谷歌的东西,但我的解决方案是:

在API控制台中创建客户端ID(Applicaion-&gt; Other)。 使用客户端ID&amp;客户端通过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()选项提供有效的令牌。