【Android×Google Calendar】APIキーだけで日本の祝日を取得するまでの道のり
はじめに
Androidアプリ開発初心者がGoogle Calendar API の扱いでハマったので、その顛末と解決方法を共有します。
-
やりたいこと
- Google が提供する「日本の祝日」カレンダー(
ja.japanese.official#holiday@group.v.calendar.google.com
)から祝日情報を取得 - OAuth2 認証は不要。API キーだけでシンプルに実装したい
- Google が提供する「日本の祝日」カレンダー(
ハマりポイント
- 公式の QuickstartにはKotlinのサンプルがない+ユーザー認証込みのサンプルしかない(Java×OAuth2を参照)
- Retrofit2 で叩く案も検討したが、レスポンスのデータモデル定義が煩雑で断念
(データモデル定義を明示的にしなくてもいい方法があるのであれば誰か教えてください。) - 公式ライブラリを「API キーのみ」で動かす方法がWebで見つけられない
解決のポイント
- Google の提供するクライアントライブラリで認証不要ならBuilder()の認証情報(Credential)を
null
にすればいい。 - events().list(
ja.japanese.official#holiday@group.v.calendar.google.com
) のようにカレンダーIDを指定できる。
実装
import com.google.api.client.http.javanet.NetHttpTransport
import com.google.api.client.json.gson.GsonFactory
import com.google.api.services.calendar.Calendar
// アクセスするカレンダーIDを定数として定義
companion object {
private const val CALENDAR_ID = "ja.japanese.official#holiday@group.v.calendar.google.com"
}
private val transport = NetHttpTransport()
private val jsonFactory = GsonFactory.getDefaultInstance()
private val calendar = Calendar.Builder(transport, jsonFactory, null)
.setApplicationName(BuildConfig.APPLICATION_ID)
.build()
val events = calendar.events().list(CALENDAR_ID)
.setKey(BuildConfig.GOOGLE_API_KEY) // APIキーを指定
.setTimeMin(timeMin)
.setTimeMax(timeMax)
.setOrderBy("startTime")
.setSingleEvents(true)
.execute()
開発環境
- Kotlin: 2.0.0
- Android Studio: Ladybug Feature Drop | 2024.2.2 Patch 2
- minSdk: 24
- targetSdk: 35
- 使用ライブラリ:
- com.google.api-client:google-api-client-android:2.0.0
- com.google.apis:google-api-services-calendar:v3-rev20220715-2.0.0
おわりに
初めての Android アプリで Google Calendar を扱うのは結構大変でしたが、
公式ライブラリ+API キーだけでも祝日取得できるということがわかってスッキリしました。
この記事が、同じところで詰まっている誰かの助けになれば幸いです。
GCP 側の API Key 制限やセキュリティ設定については別記事でにします。
参考
GoogleCalendarAPIの日本の祝日が国民の祝日以外も祝日扱いするようになった件
Google Calendar API クイックスタート