android google 日历 api 在发布时不工作
android google calendar api not working when in release
我正在使用 google 日历 api 从 public 日历中获取事件。
在 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 中调试时工作正常,但当我为发布构建时(使用密钥库文件签名)它不起作用。它只是 returns 以下异常:
com.google.a.a.c.b.c: 404 Not Found 3097-3187/com.news.apoelnews
W/System.err: Not Found 3097-3187/com.news.apoelnews W/System.err:
at com.google.a.a.c.d.a.c.b(Unknown Source)
请帮忙!
更新
我在代码中添加了 android API 键的使用,如下所示:
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
Forbidden W/System.err: "code" : 403, W/System.err: "errors" : [ {
W/System.err: "domain" : "usageLimits", W/System.err:
"message" : "There is a per-IP or per-Referer restriction configured
on your API key and the request does not match these restrictions
请注意,API 密钥是使用调试和发布 SHA-1 创建的。
是否为签名密钥库生成了 api/Key,并且您是否更改了与您的发行版密钥库相匹配的项目中的 api 密钥
问题是在版本构建期间 gradle 选项 'minifyenable true' 混淆了 google api class 名称。所以解决方案是包括:
-保持 class com.google.api.** { *; }
在混淆器中
我不太了解 Google 日历 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
试一试
我正在使用 google 日历 api 从 public 日历中获取事件。 在 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 中调试时工作正常,但当我为发布构建时(使用密钥库文件签名)它不起作用。它只是 returns 以下异常:
com.google.a.a.c.b.c: 404 Not Found 3097-3187/com.news.apoelnews W/System.err: Not Found 3097-3187/com.news.apoelnews W/System.err:
at com.google.a.a.c.d.a.c.b(Unknown Source)
请帮忙!
更新 我在代码中添加了 android API 键的使用,如下所示:
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 Forbidden W/System.err: "code" : 403, W/System.err: "errors" : [ { W/System.err: "domain" : "usageLimits", W/System.err:
"message" : "There is a per-IP or per-Referer restriction configured on your API key and the request does not match these restrictions
请注意,API 密钥是使用调试和发布 SHA-1 创建的。
是否为签名密钥库生成了 api/Key,并且您是否更改了与您的发行版密钥库相匹配的项目中的 api 密钥
问题是在版本构建期间 gradle 选项 'minifyenable true' 混淆了 google api class 名称。所以解决方案是包括: -保持 class com.google.api.** { *; } 在混淆器中
我不太了解 Google 日历 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
试一试