繁体   English   中英

使用Android进行Gmail API访问

[英]Gmail API access using Android

我正在尝试使用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): }

是否需要在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服务时会遇到异常。 此外,我已经尝试清除令牌并要求一个具有相同结果的新令牌。

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

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

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

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

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

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

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

  1. 选择您的项目,选择API&Auth,然后单击凭据
  2. 创建新的客户端ID(尽管它有其他客户端ID)
  3. 选择已安装的应用程序 - > android
  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

您的问题将自动解决。 确保使用调试密钥库和发布密钥库创建客户端ID和密钥。

那么这就是交易。 到目前为止,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()选项提供有效的令牌。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM