


Firebase Cloud Functions には、HTTP リクエストでトリガーできる関数があります。
const functions = require('firebase-functions');
exports.helloWorld = functions.https.onRequest((request, response) =>
{
response.send("Hello from Firebase!");
});
基本的にはこのような形をしています。
この関数をアプリから呼び出したい場合に、簡単にできる仕組みが SDK に用意されています。
公式のドキュメントはこちらです。
まず、Function ですが、onRequest ではなく onCall というトリガーを使います。
例えば、以下のようになります。
const functions = require('firebase-functions');
exports.testDemo = functions.https.onCall((data, context) =>
{
return { foo : data.foo };
});
これを、Firebase のサーバにデプロイします。
すると Firebase コンソールの Functions の画面に、デプロイした関数が表示されます。
この関数はアプリから呼び出すためのものですので、ブラウザで URL を開くと、エラーが表示されます。
これを Android アプリから呼び出すには、まず、アプリレベルの build.gradle に以下の依存関係を追加します。
implementation ‘com.google.firebase:firebase-functions:19.0.2’
そして、以下のように実装します。
FirebaseFunctions functions = FirebaseFunctions.getInstance();
Map<String, Object> data = new HashMap<>();
data.put("foo", "bar");
Task<HttpsCallableResult> task = functions.getHttpsCallable("testDemo").call(data);
task.addOnCompleteListener(new OnCompleteListener<HttpsCallableResult>() {
@Override
public void onComplete(@NonNull Task<HttpsCallableResult> task) {
if (task.isSuccessful()) {
HttpsCallableResult result = task.getResult();
Map map = (Map)result.getData();
Log.d(TAG, "Call function success " + map);
} else {
Log.d(TAG, "Call function failure", task.getException());
}
}
});
ローカルエミュレータで動作している Functions を呼び出すこともできます。
ローカルエミュレータは、以下のコマンドで起動します。
$ firebase emulators:start –only functions
先ほどのアプリのコードの先頭付近を以下のように変更します。
FirebaseFunctions functions = FirebaseFunctions.getInstance();
functions.useFunctionsEmulator("http://10.0.2.2:5001");
ただし、このアプリを実行した場合、関数を呼び出した所で、下記のエラーが出ます。
java.net.UnknownServiceException: CLEARTEXT communication to 10.0.2.2 not permitted by network security policy
Android 9 以降では、HTTP 通信が無効になっているために発生するエラーです。
これの修正方法は、ネットに沢山情報がありますので、検索してみて下さい。
解説は以上ですが、useFunctionsEmulator(“http://10.0.2.2:5001”) のところを、useFunctionsEmulator(“localhost:5001”) にした場合の、エラーについて書いておきます。
その場合、以下のようなエラーが出ます。
java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 5001) from /127.0.0.1 (port ) after 10000ms: isConnected failed: ECONNREFUSED (Connection refused)
どうも localhost を指定することは出来ないようです。
その代わり、特別に用意された 10.0.2.2 というアドレスを使う必要があるようです。