ゲーム開発の備忘録

趣味のゲーム開発でのノウハウや、技術的に嵌ったポイントを忘れないように書き記しておくブログです。

com.google.android.gms.drive.DriveのScope定数をDeprecatedでない代替手段に置き換える

はじめに

2019年6月に、Google Play Servicesの各種ライブラリがバージョンアップされ、それを契機としてGoogle Drive Android APIの各種クラスに@Deprecatedが付与されました。
もともと、Google Drive Android APIは2019年12月に廃止される告知が2018年12月になされていました。
告知開始から6ヵ月経過した今のタイミングで@Deprecatedがされたものと思われます。

developers.google.com

さて、本記事ではGoogle Drive Android APIに含まれるcom.google.android.gms.drive.DriveのScope定数をDeprecatedでない代替手段に置き換える方法を説明します。
com.google.android.gms.drive.DriveのScope定数は、Google Driveそのものを直接扱う場合以外にも、Google Play Games ServicesのSaved Games利用時のsignInOptions構築に必要になっていました。
以下に、Saved Games利用時のsignInOptions構築のコードを掲載します。(本記事のコードは、ライブラリのJavaコード以外は全てKotlinで記述しています)

val signInOptions = GoogleSignInOptions
                .Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
                .requestEmail()
                .requestIdToken(parent.getString(R.string.default_web_client_id))
                .requestScopes(Drive.SCOPE_APPFOLDER)
                .build()

5行目の requestScopes(Drive.SCOPE_APPFOLDER) がSaved Games利用時に必要なScope要求の記述です。
しかし、DriveクラスはDeprecatedになったため、別の手段で置き換える必要があります。

Scope定数の中身を確認する

ここで、Drive.SCOPE_APPFOLDERの定義を確認してみましょう。
すると、com.google.android.gms.drive.Driveで以下のように定義されていることが確認できます。

public static final Scope SCOPE_APPFOLDER = new Scope("https://www.googleapis.com/auth/drive.appdata");

Scopeクラスを、コンストラクタにURL文字列を渡して生成すればよいことが分かります。
ScopeクラスはGoogle Drive Android APIには含まれておらず、かつ、コンストラクタに渡されるURLはGoogle Drive関連の全てのAPIで利用されるURLであり、Google Drive Android API廃止後も継続して利用可能なURLであることが分かっているため、上記コードの右辺をそのまま利用すれば良さそうです。
従って、以下のように書くことができます。

val signInOptions = GoogleSignInOptions
                .Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
                .requestEmail()
                .requestIdToken(parent.getString(R.string.default_web_client_id))
                .requestScopes(Scope("https://www.googleapis.com/auth/drive.appdata"))
                .build()

Drive REST API Java wrappersを利用してURL文字列のハードコーディングを排除する

廃止対象のcom.google.android.gms.drive.Driveは利用しなくても良くなりましたが、先程のコードにはURL文字列がハードコーディングされているという問題点があります。将来的にこのURLが変更される可能性がありますし、それはGoogle Driveおよびライブラリ側の事情なので、URLが変更されても実際に問題が発生するまで気付くことができません。
そこで、本記事冒頭で紹介したGoogleの公式ドキュメントで、Google Drive Android APIの移行先として示されているDrive REST API Java wrappersを利用します。

まずは、Drive REST API Java wrappersを利用するために、build.gradleに以下を追記します。

implementation 'com.google.apis:google-api-services-drive:v3-rev110-1.23.0'

Drive REST API Java wrappersには、com.google.api.services.drive.DriveScopesというクラスが存在します。
このクラスには、Scopeとして指定するURL文字列定数が用意されています。
以下に、Drive REST API Java wrappersで定義されているDriveScopes.DRIVE_APPDATAの定義を示します。

public static final String DRIVE_APPDATA = "https://www.googleapis.com/auth/drive.appdata";

このURLは、先ほどcom.google.android.gms.drive.Driveの定義を確認して見つけたURL文字列と一致していますね。
従って、以下のように記述できます。以下が今回の修正の最終形です。

val signInOptions = GoogleSignInOptions
                .Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
                .requestEmail()
                .requestIdToken(parent.getString(R.string.default_web_client_id))
                .requestScopes(Scope(DriveScopes.DRIVE_APPDATA))
                .build()