Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Android访问Gmail API_Android_Google Oauth_Gmail Api_Google Schemas_Google Oauth Java Client - Fatal编程技术网

使用Android访问Gmail API

使用Android访问Gmail API,android,google-oauth,gmail-api,google-schemas,google-oauth-java-client,Android,Google Oauth,Gmail Api,Google Schemas,Google Oauth Java Client,我正在尝试使用Android应用程序访问Gmail API。 我已使用所有可用的作用域组合成功请求并接收访问令牌。 但似乎每次我真正尝试使用Gmail API命令时,我都会收到一个403异常:Access未配置请使用Google开发者控制台激活API… 不用说API已经激活,并且使用正确的包名&sha1代码创建了客户机密钥。相同的客户端ID可以很好地与Google Plus功能配合使用 有人有这个问题或成功地从Android连接到Gmail api吗 谢谢 这是日志: 09-04 21:40:5

我正在尝试使用Android应用程序访问Gmail API。 我已使用所有可用的作用域组合成功请求并接收访问令牌。 但似乎每次我真正尝试使用Gmail API命令时,我都会收到一个
403异常:Access未配置请使用Google开发者控制台激活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();
}
GoogleCredential credential=new GoogleCredential().setAccessToken(令牌);
JsonFactory JsonFactory=新的JacksonFactory();
HttpTransport HttpTransport=新的NetHttpTransport();
service=new Gmail.Builder(httpTransport,jsonFactory,credential).setApplicationName(“GmailApiTP”).build();
ListMessagesResponse MessagesResponse;
列表m=null;
ArrayList ID=新的ArrayList();
添加(“收件箱”);
试一试{
messagesRespose=service.users().messages().list(“me”).setLabelIds(id).setQ(“From:something”)
.execute();
m=messagesRespose.getMessages();
}捕获(IOE异常){
e、 printStackTrace();
}

使用Gmail API服务时会捕获异常。此外,我还尝试清除令牌并请求一个具有相同结果的新令牌。

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

确认您正确地遵循了以下说明:

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


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

好吧,交易就这样。到目前为止,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()选项将提供一个有效的令牌。

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


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

您需要在Google开发控制台中设置Android应用程序密钥

  • 选择您的项目,选择API&Auth,然后单击凭据
  • 创建新的客户端id(尽管它有其他客户端id)
  • 选择installed app->android
  • 请正确填写您的软件包名称和SHA1
  • 创建新密钥(尽管它有其他客户端密钥)
  • 选择安卓键
  • 填写SHA1;包装名称如下:
    45:B5:E4:6F:36:AD:0A:98:94:B4:02:66:2B:12:17:F2:56:26:A0:E0;com.示例

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

    创建了一个带有E深度链接的已安装应用程序(android)。Sha1和包装已验证。同样的clienr id也适用于googleplusapi。感觉这个API不是为与AndroidAPI对话而设计的。这个API与客户端/平台无关,它应该可以在Android上工作,也可以在任何其他Google API上工作。不确定这里的问题是什么,希望有人观看google oauth或google oauth java客户端标记可以提供一些见解。谢谢。我会继续努力找出问题所在。问题是,我并没有看到很多Gmail API Android用户能够从实际使用它的人那里获得良好的反馈。我现在可以确认,使用GoogleAuthUtil类或AccountManager类收到的任何访问令牌都不会与Gmail API一起使用。另一方面,通过API控制台中客户端ID设置为“other”的WebView请求令牌将起作用。问题是代币的寿命很短。现在我面临着一个新问题。如何在不弹出对话框的情况下刷新令牌。看来这是固定的,对吗?(也要感谢Noam Wies。)所以我一定是做错了什么,因为即使我用GoogleAuthUtil.getToken()请求一个新令牌,然后用GoogleAuthUtil.clearToken()清除它,然后请求一个新令牌,新令牌仍然不起作用(403)。你用GoogleAuthUtil连接Gmail API了吗?如果你能分享你的代码那就太好了。我可能完全错了不?以下是令牌详细信息:{“颁发给”:“608941808256-43vtfndets79kf5hac8ieujto8837660.ap