【问题标题】:android google calendar api not working when in releaseandroid google calendar api在发布时不起作用
【发布时间】:2016-05-09 03:33:15
【问题描述】:

我正在使用 google calendar api 从公共日历中获取事件。 在 google 开发者控制台中,我创建了一个服务帐户密钥 (json),用于在 android 代码中设置 GoogleCredential,如下所示:

 AssetManager am = getAssets();
 InputStream inputStream = am.open("key-file-name.json");

 GoogleCredential credential = GoogleCredential.fromStream(inputStream);

credential =credential.createScoped(Arrays.asList("https://www.googleapis.com/auth/calendar.readonly"));

然后我使用这个 GoogleCredential 来获取日历对象

Calendar client = new Calendar.Builder(AndroidHttp.newCompatibleTransport(),
                   new JacksonFactory(),
                   credential).setApplicationName("someAppName").build();

然后我会从此日历中获取接下来的 5 个事件

  com.google.api.services.calendar.model.Events nextEvent =
                           client.events().list("public-calendar-id@group.calendar.google.com")
                                   .setTimeMin(new DateTime(new java.util.Date(), java.util.TimeZone.getDefault()))
                                   .setMaxResults(5)
                                   .setOrderBy("startTime")
                                   .setSingleEvents(true)
                                   .setShowDeleted(false)
                                   .execute();

虽然此代码在 android studio 中运行时在调试中运行良好,但当我构建发布(使用密钥库文件签名)时它不起作用。它只是返回以下异常:

com.google.a.a.c.b.c:404 未找到 3097-3187/com.news.apoelnews W/System.err:未找到 3097-3187/com.news.apoelnews W/System.err:
在 com.google.a.a.c.d.a.c.b(未知来源)

请帮忙!

更新 我在代码中添加了android API key的使用如下:

com.google.api.services.calendar.model.Events nextEvent =
client.events().list("public-calendar-id@group.calendar.google.com")
.setTimeMin(new DateTime(new java.util.Date(), java.util.TimeZone.getDefault()))
.setMaxResults(5)
.setOrderBy("startTime")
.setSingleEvents(true)
.setShowDeleted(false)
.setKey("api-key-string_from_developer_console"))
.execute();

这会导致以下异常:

W/System.err: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 禁止 W/System.err:“代码”:403,W/System.err:“错误”:[ { W/System.err:“域”:“usageLimits”,W/System.err:
"message" : "配置了 per-IP 或 per-Referer 限制 在您的 API 密钥上,并且请求不符合这些限制

请注意,API 密钥是使用调试版和发布版 SHA-1 创建的。

【问题讨论】:

  • 由于您使用的是服务帐户,因此您使用的是 Calendar for Work(Google Apps for Work)吗?
  • 为什么使用服务帐户?据我所知,如果您使用的是 Google Apps for Work (domain-wide authority delegation),则可以使用服务帐户。
  • 你是对的。我现在修改了我的代码,我只使用了 android API 密钥。
  • 在开发者控制台添加你的域名

标签: android google-api google-calendar-api


【解决方案1】:

已为 Signed Keystore 生成 api/Key,并且您更改了项目中与您的发布 Keystore 匹配的 api 密钥

【讨论】:

  • 我创建了一个带有调试和发布 SHA-1 的 API 密钥。但正如您在代码中看到的那样,我只使用创建服务帐户密钥时生成的 json 文件。我应该在哪里使用 API 密钥?如果需要 API 密钥,那么为什么它可以在调试中工作?谢谢
  • 您使用的 Json 是 Degug Keystore 的,下载 Release Keystore 的 Json 并将其替换到您的 assets 文件夹中
  • 当我创建生成 json 文件的服务帐户密钥时,我没有指定标识调试或发布的 SHA-1。我在哪里可以下载用于发布密钥库的 json?使用 SHA-1 版本生成的 API 密钥不会生成 json 文件
  • 您是在为 Web 或 android 创建密钥
  • 我不使用 API 密钥。我使用服务帐户密钥中的 json 文件。如果我在调用中使用 API 密钥,我会得到以下信息:“代码”:403,W/System.err:“错误”:[ { W/System.err:“域”:“usageLimits”,W/System.错误:“消息”:“在您的 API 密钥上配置了 per-IP 或 per-Referer 限制,并且请求与这些限制不匹配。如果来自此 IP 的请求,请使用 Google Developers Console 更新您的 API 密钥配置或应该允许引用者。",
【解决方案2】:

问题是在构建版本期间,gradle 选项“minifyenable true”与 google api 类名称混淆。所以解决方案是包括: -keep class com.google.api.** { *; } 在proguard中

【讨论】:

    【解决方案3】:

    我不太了解 Google Calendar Api,但是 是否尝试使用您的发布密钥库生成 SHA-1 密钥?如果您想生成发布 apk,那么您必须为 Google 日历创建新密钥并再次发布它会为您工作。

    点击一些有用的链接:https://developer.android.com/studio/publish/app-signing.html#releasemode

    https://coderwall.com/p/r09hoq/android-generate-release-debug-keystores

    试试看

    【讨论】:

      猜你喜欢
      • 2017-09-30
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 2013-03-26
      • 2014-09-07
      相关资源
      最近更新 更多