前回は、
新しく追加された機能は非常に多く、
- Analytics
- Storage
- Remote Config
Analytics
Analyticsは新しくなったFirebaseの中核となる分析基盤です。ユーザのさまざまな行動を簡単に収集・
AnalyticsをAndroidで利用するにはアプリのbuild.
に次の依存関係を追加するだけです。
compile 'com.google.firebase:firebase-core:9.0.2'
この設定は基本的にすべてのFirebaseプロダクト群を導入する際にかならず実行しているはずなので、
イベントの記録
イベントの記録はFirebaseAnalytics
インスタンスのlogEvent()
メソッドを利用します。
次の例のように、FirebaseAnalytics
の変数を用意しておき、onCreate()
内で
FirebaseAnalytics.
を使って初期化します。
// Activityのフィールド
private FirebaseAnalytics firebaseAnalytics;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
// インスタンスの取得
firebaseAnalytics = FirebaseAnalytics.getInstance(this);
あとはイベントを記録したい任意の場所でlogEvent()
メソッドを呼ぶだけです。
logEvent()
には記録するイベントと任意のパラメータを次のようにBundle
形式で渡します。
Bundle params = new Bundle();
params.putString("screen_name", "LoginActivity");
firebaseAnalytics.logEvent("open_screen", params);
これだけです。ここでは表示したページを記録するためのopen_
というイベントを定義し、screen_
に対応するページ情報を送信しています。
この例では記録する際にイベント名もパラメータも任意のものを指定しましたが、FirebaseAnalytics.
とFirebaseAnalytics.
という名前空間に定義されているのでいくつか紹介します。
イベント | 概要 |
---|---|
ADD_ | 支払情報を入力したイベント |
ADD_ | 商品をカートに追加したイベント |
ADD_ | 商品をウィッシュリストに追加したイベント |
パラメータ | 概要 |
---|---|
ITEM_ | 商品ID |
ITEM_ | 商品名 |
PRICE | 値段 |
これらは次のように利用します。
Bundle params = new Bundle();
params.putString(FirebaseAnalytics.Param.ITEM_ID, "12345");
params.putString(FirebaseAnalytics.Param.ITEM_NAME, "高級ブランド革の財布");
params.putDouble(FirebaseAnalytics.Param.PRICE, 29800.0);
firebaseAnalytics.logEvent(FirebaseAnalytics.Event.ADD_TO_CART, params);
ここではオンラインショッピングアプリで使うようなイベントとパラメータを一例としてご紹介しましたが、
ここに定義されたものを使わなければならないということはまったくありませんが、
なお、logEvent()
を呼びださなくても、
たとえばユーザが初めてアプリを開いたときにはfirst_
イベントが記録され、session_
が自動で記録されます。他にもアプリの更新やアンインストールまでも自動的に収集してくれます。詳しくは自動的に収集されるイベントのドキュメントをご参照ください。
記録したイベントは数時間程度でWebコンソールに反映されます。Analyticsのコンソールから

ただ、
制限事項
現状、FirebaseAnalytics.
で定義されたパラメータのみ細かく確認することができます。
ワークアラウンドとして既存のパラメータを流用するか、FirebaseAnalytics.
を利用する、
ユーザプロパティ
Analyticsではユーザプロパティという属性を各ユーザに設定することで、
FirebaseのWebコンソールにログインし、

「ユーザープロパティ名」

あとはプログラムからこのプロパティ名に対応する値を送信してやるだけです。
次の例ではカスタムApplicationクラスのonCreate()
内でユーザープロパティを設定しています。設定にはsetUserProperty()
メソッドを利用します。
FirebaseAnalytics firebaseAnalytics = FirebaseAnalytics.getInstance(this);
firebaseAnalytics.setUserProperty("design_type", "type_a");
これで以後のイベントの記録にはこのユーザープロパティが付与されて記録されるようになります。
数時間後ユーザープロパティが反映されたら、
イベントタブから

その後

AnalyticsのTips
Instant Runの無効
Android Studio 2.
もしAndroid Studio 2.Enable Instant Run
のチェックを外してInstant Runを無効にしてください。

デバッグ時のイベント送信確認
AnalyticsのイベントがWebコンソールに反映されるには数時間かかります。もし開発環境でイベントがきちんと記録されているか確認したい場合は、
adb shell setprop log.tag.FA VERBOSE
adb shell setprop log.tag.FA-SVC VERBOSE
adb logcat -v time -s FA FA-SVC
次のようにコンソールにイベントの記録の様子が出力されれば成功です。
(20381): onActivityCreated
(20381): Tag Manager is not found and thus will not be used
(20381): Logging event (FE): open_screen, Bundle[{screen_name=LoginActivity, _o=app}]
Storage
StorageはGoogle Cloud Storageのバケットを利用して大容量の画像やファイルを簡単かつセキュアにアップロードしたりダウンロードしたりできる機能です。
StorageをAndroidで利用するにはアプリのbuild.
に次の依存関係を追加します。
compile 'com.google.firebase:firebase-storage:9.0.2'
compile 'com.google.firebase:firebase-auth:9.0.2'
Storageへの操作はFirebaseStorage
インスタンス越しに行います。FirebaseStorage
インスタンスはFirebaseStorage.
で取得することができます。
FirebaseStorage storage = FirebaseStorage.getInstance();
リファレンス
Storageにファイルをアップロード/
FirebaseのWebコンソールにログイン、gs://<your-project-id>
の部分をクリップボードにコピーしてください。

リファレンスの取得にはStorageReference
インスタンスのgetReferenceFromUrl("gs://<your-project-id>")
メソッドを利用します。gs://
の部分には先ほどWebコンソールで確認したURIをペーストしてください。
StorageReference storageRef = storage.getReferenceFromUrl("gs://<your-project-id>");
リファレンスを取得できたら、/images/
にファイルを書き込むために、
StorageReference target = storageRef.child("images").child("sample.jpg");
.child()
メソッドを連結することで、
アップロード
Storageのリファレンスの扱いについて理解したところでいよいよファイルをアップロードしてみましょう。
アップロード方法はいくつかあるのですが、InputStream
を利用した例を解説します。まずは次のコードをご覧ください。
FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference storageRef = storage.getReferenceFromUrl("gs://<your-project-id>");
StorageReference target = storageRef.child("images").child("sample.jpg");
InputStream inputStream = new FileInputStream(new File("path/to/images/target_image.jpg"));
target.putStream(inputStream)
.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Log.d(TAG, "Upload succeeded!");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(TAG, "Upload failure!", e);
}
});
Storageへのリファレンスを取得しstorageRef.
で/images/
に対してファイルをアップロードする準備をしています。それからnew FileInputStream(new File("path/
で端末に保存されたファイルをInputStream
としてオープンしています。あとはtarget.
にそのストリームを渡してアップロードしています。
アップロードの成功と失敗はそれぞれaddOnSuccessListener()
とaddOnFailureListener()
にOnSuccessListener
とOnFailureListener
リスナを渡してコールバックしてもらいます。
Webコンソールを確認して、

InputStream
を使う以外にもandroid.
を使う方法などもあるので、
ダウンロード
ダウンロードもリファレンスの取得まではまったく同じです。次の例ではサーバ上の/images/
のリファレンスを取得し、
FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference storageRef = storage.getReferenceFromUrl("gs://<your-project-id>");
StorageReference fileRef = storageRef.child("images").child("sample.jpg");
try {
File localFile = File.createTempFile("images", "jpg");
fileRef.getFile(localFile)
.addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
long totalBytes = taskSnapshot.getTotalByteCount();
Log.d(TAG, "Download succeeded! Total bytes: " + totalBytes);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(TAG, "Download failure!", e);
}
});
} catch (IOException e) {
Log.e(TAG, e.getMessage(), e);
}
File.
でファイルをダウンロードする先の一時ファイルを作成し、fileRef.
でファイルをダウンロードしています。
成功と失敗のコールバックはアップロード時と同様です。ログにDownload succeeded!
とファイルのバイト数が表示されれば成功です。
ダウンロードもいくつか方法があるので、
削除
ファイルの削除もこれまで同様ファイルへのリファレンス経由で行います。次のようにリファレンスからdelete()
メソッドを呼び出すだけです。成功と失敗コールバックもこれまで同様です。
FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference storageRef = storage.getReferenceFromUrl("gs://<your-project-id>");
StorageReference fileRef = storageRef.child("images").child("sample.jpg");
fileRef.delete()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "Delete succeeded!");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(TAG, "Delete failure!", e);
}
});
Remote Config
Remote ConfigはA/
たとえば
今回はユーザによって画面の背景色を変える例を見てみましょう。
Webコンソールでの設定
まずはサーバ上にシンプルなキーと値のペアを定義します。Remote Configでは設定値をサーバに持ち、
WebコンソールからRemote Configを選択し

「パラメーターキー」color
、white
を設定します。

「変更を公開」

確認ダイアログで

コンソールでの準備はいったん終了です。
Android Studioでの作業
次にAndroidのコードからRemote Configを利用します。
Remote ConfigをAndroidで利用するには、build.
に次の依存関係を追加します。
compile 'com.google.firebase:firebase-config:9.0.2'
続いてアプリのres
ディレクトリ以下にxml
というディレクトリを作成し、remote_
というXMLファイルを作成します。中身は次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<defaultsMap>
<entry>
<key>color</key>
<value>white</value>
</entry>
</defaultsMap>
これはクライアントサイドにおける初期値として利用します。Remote Configではサーバサイドに設定値を持ちますが、
したがってkey
には先ほどWebコンソールで設定したのとまったく同じcolor
を設定する必要があります。value
もまずはサーバサイドと同じwhite
で問題ありません。
それではコードを書いていきます。Activityに次のようなコードを追加してください。
private View container;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 背景
container = findViewById(R.id.container);
// デバッグ時には必要
FirebaseRemoteConfigSettings remoteConfigSettings = new FirebaseRemoteConfigSettings.Builder()
.setDeveloperModeEnabled(BuildConfig.DEBUG)
.build();
remoteConfig = FirebaseRemoteConfig.getInstance();
remoteConfig.setConfigSettings(remoteConfigSettings);
remoteConfig.setDefaults(R.xml.remote_config_defaults);
fetch();
まずはじめに、View
を定義し、findViewById()
で探しておきます。
次の行のFirebaseRemoteConfigSettings
はRemote Configの設定用クラスです。Remote Configは、setDeveloperModeEnabled(BuildConfig.
することで、
次にFirebaseRemoteConfig.
でRemote Configのインスタンスを取得し、setConfigSettings(remoteConfigSettings)
で先ほどの設定を適用します。
次にremoteConfig.
で最初に定義したremote_
をデフォルト値として指定します。これでもしサーバと通信できなくても初期値が利用できるので、
最終行のfetch()
メソッドはこのあと作成します。
サーバから情報を取得
それではサーバから情報を取得するコードを書いていきます。次のようなfetch()
メソッドを作成してください。
private void fetch() {
long cacheExpiration = 3600;
if (remoteConfig.getInfo().getConfigSettings().isDeveloperModeEnabled()) {
cacheExpiration = 0;
}
remoteConfig.fetch(cacheExpiration)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "Fetch succeeded.");
remoteConfig.activateFetched();
String colorName = remoteConfig.getString(KEY_COLOR);
container.setBackgroundColor(Color.parseColor(colorName));
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.e(TAG, "Fetch failed.", e);
}
});
}
まずremoteConfig.
で開発モードか否かを判定しています。開発モードは前述のsetDeveloperModeEnabled(BuildConfig.
で設定したもので、
次にremoteConfig.
でキャッシュ時間を指定しつつ、addOnSuccessListener()
とaddOnFailureListener()
で取得します。
成功時のonSuccess()
内のremoteConfig.
の部分に注目してください。ここでサーバから取得した設定を有効化しています。
設定値はremoteConfig.
で取得します。getString()
の部分はgetBoolean()
, getLogn()
, getDouble()
などよく使う型は用意されています。container.
で取得した値を元に背景色を設定しています。
ちなみにremoteConfig.
の部分はアプリを起動直後など、remote_
はこのための初期値なのです。
サーバサイドで設定値を変更
アプリをビルドして立ち上げると、white
であるからです。
ではWebコンソールからcolor
のデフォルト値をred
などに変更して
このようにRemote Configでは設定値をサーバサイドに持つことができるので、
A/Bテストしてみよう
前述のとおり、
Webコンソールから先ほど定義したcolor
パラメータを選択し

「新しい条件を定義」

「名前」A_
とつけてユーザー
とし、50%
と入力して

デフォルト値とそれ以外で値を変えることで50%の割合で異なった値を取得することができます。

なお、white
、black
といった具合です。
もし複数の条件が両方マッチする場合、
Tips
サーバから設定を取得するタイミング
Remote Configでは任意のタイミングでサーバから設定を取得し、
筆者のおすすめは、
A/Bテストの効果測定
A/
まとめ
いかがだったでしょうか。今回は新しくなったFirebaseの数多の機能の中から3つだけピックアップしてご紹介しましたが、
次回は今回に続いて、