大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

Firebaseのstorageサンプルでエラー

株式会社クローバーフィールドの経営理念
著者:津路高広
公開日:2021/09/28
最終更新日:2021/09/28
カテゴリー:技術情報
タグ:

津路です。秋晴れとなり、気分よく作業しています。

先日、mBaaSの代表、Firebaseを使ってみることにしました。
Firebaseでは、コンソールでアプリの登録作業をまず行うことになっています。
そして、コンソールからjsonファイルを取得して、Androidプロジェクトのappフォルダ直下に置きます。

上記作業は簡単ですが、認証情報のクライアントIDを間違うと、12500エラーが発生して、変なことになります。
原因としてよくあるのは、クライアントIDがweb用でない場合と、アプリのサポートメールアドレスの入力忘れです。

12500エラーとは、そもそもFirebase自身がよくわからないエラーとして報告します。
しかし、私の場合、Authプロジェクトではまさに不明でした。仮想デバイスでのテストでこのエラーが出て、端末では出ませんでした。

まず、Firebaseで公開されているサンプルプロジェクトを取得してきます。
https://github.com/firebase/quickstart-android
このプロジェクトでは、Auth, storage, firestoreなど、様々な下層プロジェクトで構成されています。

今回は、storage(データファイルの保存・取得機能)のサンプルのみを取り出して、ビルドします。
他に必要なのは、internalプロジェクトです。フォルダ名を見るとわかりますが、chooserx,lintなどを提供しています。
まず、Android Studio Arctix Fox 2021.3.1 環境でのビルドの時点で、DEXの64K 参照制限エラーが出ます。
APKに含まれるDalvik Executable(DEX)形式のバイトコード実行ファイルで、64Kを超えるメソッドを参照するとエラーが起きます。
appのbuild.gradleのdefaultConfigセクションにmultiDexEnabled trueを追加。

ビルドを通して、起動して、Sign Inボタンでは、動きません。これは、anonymousログインエラーです。
コンソールに戻って、匿名ログインを有効にします。

さて、Sign Inして、Upload Photoボタンで、突然アプリが落ちます。
logcatを見ても、Fatal Exceptionなるログが見つかりませんでした。まあ、これは、後で考えると、単にFilterがかかっていたためかもしれません。
そこで、デバッグしてみて、出てきたのが、
throw (RuntimeException) cause;
java.lang.IllegalStateException: LifecycleOwner com.google.firebase.quickstart.firebasestorage.java.MainActivity@21b33fb is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.

おかしなエラーメッセージですが、registerForActivityResultの使いどころが間違っています。
Android 1レベルから使われてきたStartActivityResultの置き換えメソッドとして登場しました。
launchCamera関数の中でこれが突然使われているのが間違えていて、callbackの登録は、ActivityがCreateされる前にせよとの指摘です。

Javaコード

    上に戻る