リニューアルで実装は単純化されていたのだが・・・
久々に、
The Google Drive API for Android
を実装した。
リニューアルされていて、それ以前よりもずっと単純な実装で実現できて、こりゃ楽勝だわと思っていたのだが、Google Playにリリース後、
が、以下のログを出力していて、結構、ハマってしまった。
W/Auth: [GetToken] GetToken failed with status code: UNREGISTERED_ON_API_CONSOLE
E/TokenRequestor: You have wrong OAuth2 related configurations, please check. Detailed error: UNREGISTERED_ON_API_CONSOLE
何故だ、、、「リリース用の署名」でビルドして開発していたので、開発時とリリース時でAPKの違いはない想定だったのに、Google Playで配信されているアプリでは、「Google サインイン」は必ず失敗していた。
原因(1)「Firebaseと別プロジェクトになっている」ことに気づかなかった
から
The Google Drive API for Android
の利用を登録するのだが、既に組み込み済みのFirebaseと別プロジェクトにしてしまったという凡ミスをこいていた。
「google-services.json」をAndroid開発環境に組み込むわけだが、別プロジェクトではもちろん「google-services.json」は個別に違うわけだから、2つのサービスが同時に実現されるわけがなかった(別々の「google-services.json」を環境に2つ組み込むことなんてできないし)。
これは、普通に凡ミス。
(でも、開発時にこの状態でもGoogle Sign-Inがエラーなく動いていることが罠だろ……)。
Firebaseで既に登録済みのプロジェクトに、Google Driveを改めて追加した。
んで、もう一度、「google-services.json」をダウンロードして、ファイルとしてメモ帳で開いてみて、ちゃんとFirebaseとGoogle Driveが同時に記載されていることを確認して、これは解決した。
原因(2)「Google Play App Signingプログラム」を理解できていなかった
最近、「Google Play Console」に「Google Play App Signingプログラム」が追加された。
ざっと仕様を確認して、特に何も考えずにオプトインしていたのだが、この怠惰がいけなかった。
「Google Play App Signingプログラム」に登録すると、Googleはアップロードした証明書(開発環境でビルドしていた署名)を削除して、APKに新しく署名する。
・・・うぉい、マジかよ!!!
当然、フィンガープリントが変わるので、開発環境でビルドしていた証明書のフィンガープリントをGoogle Driveの利用に登録していると、実際にGoogle Playで配信されているAPKと一致するわけがないので、「UNREGISTERED_ON_API_CONSOLE」と出力されて「Google サインイン」に絶対に失敗する。
「Google Play Console」の、
→「リリース管理」
→「アプリの署名」
を確認すると、ここに、
・アプリへの署名証明書
・アップロード証明書
が別々で表示されている!
Google Driveに登録するフィンガープリントは、自分でビルドしていた「アップロード証明書」の方ではなく、Googleが実施する「アプリへの署名証明書」の方を参照しなければならない。
事前にちゃんと知っていればなんてことはない、だが、これに気づくまで時間めちゃ取られた。。。
サンプルアプリ
上記の方法で、やっとこ解決して、
The Google Drive API for Android
と
を搭載しているので、良ければ、以下のアプリを参考にしてみてほしい(プロジェクト一式や操作動画を確認するよりも、アプリの実動作・見栄えを自らの手で確認した方が多くを得られると信じている)。
シンプルなメモ帳は文字数もカウントする-簡単操作とマテリアルデザインの無料ノート-NOTEBOSS
【動作環境】
Android OS 5.0以上
Made in Japan.
© CUTBOSS
Producer & Director, Boss of the Barber.
Lead Programmer & Designer, Boss of the Barber.