12

我正在尝试使用 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 连接起来并愿意分享吗?

编辑2:

以下是我正在做的事情的片段:

获取令牌:

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

4 回答 4

6

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

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

于 2014-09-08T18:45:02.283 回答
4

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

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

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

您可以从开发人员控制台发布您拥有的 oauth 客户端信息吗?(在其中键入和任何其他非机密信息等)

于 2014-09-04T16:34:33.320 回答
0

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

  1. 选择你的项目,选择 API & Auth,然后点击 Credentials
  2. 创建新的客户端 ID(尽管它有其他客户端 ID)
  3. 选择已安装的应用程序-> android
  4. 正确填写你的包名和SHA1
  5. 创建新密钥(尽管它有其他客户端密钥)
  6. 选择安卓键
  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 和密钥。

于 2014-11-21T08:56:44.613 回答
-3

好吧,这就是交易。到目前为止,GoogleAuthUtil && AccountManager 提供的令牌不适用于 Gmail API。不知道这是否是谷歌的事情,但我的解决方案是这样的:

在 API 控制台中创建一个 Client Id (Applicaion->Other)。使用客户端 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() 选项提供有效的令牌。

于 2014-09-08T08:34:41.183 回答