Calling a Cloud Function from Android through Firebase

前端 未结 4 1124
花落未央
花落未央 2020-12-25 14:53

Situation

I have created a Google Cloud Function through functions.https.onRequest, which is working nicely when I paste its URL in a browser and integ

相关标签:
4条回答
  • 2020-12-25 15:19

    firebaser here

    Update: There is now a client-side SDK that allows you to call Cloud Functions directly from supported devices. See Dima's answer for a sample and the latest updates.

    Original answer below...


    @looptheloop88 is correct. There is no SDK for calling Google Cloud Functions from your Android app. I would definitely file a feature request.

    But at the moment that means you should use the regular means of calling HTTP end points from Android:

    • Make an HTTP request with android
    • Android: AsyncTask to make an HTTP GET Request?
    • Http Get using Android HttpURLConnection
    • Android's HTTP Triggers documentation
    0 讨论(0)
  • 2020-12-25 15:20

    It isn't possible for now but as mentioned in the other answer, you can trigger functions using an HTTP request from Android. If you do so, it's important that you protect your functions with an authentication mechanism. Here's a basic example:

    'use strict';
    
    var functions = require('firebase-functions');
    const admin = require('firebase-admin');
    admin.initializeApp(functions.config().firebase);
    
    exports.helloWorld = functions.https.onRequest((request, response) => {
      console.log('helloWorld called');
      if (!request.headers.authorization) {
          console.error('No Firebase ID token was passed');
          response.status(403).send('Unauthorized');
          return;
      }
      admin.auth().verifyIdToken(request.headers.authorization).then(decodedIdToken => {
        console.log('ID Token correctly decoded', decodedIdToken);
        request.user = decodedIdToken;
        response.send(request.body.name +', Hello from Firebase!');
      }).catch(error => {
        console.error('Error while verifying Firebase ID token:', error);
        response.status(403).send('Unauthorized');
      });
    });
    

    To get the token in Android you should use this and then add it to your request like this:

    connection = (HttpsURLConnection) url.openConnection();
    ...
    connection.setRequestProperty("Authorization", token);
    
    0 讨论(0)
  • 2020-12-25 15:25

    Since version 12.0.0 you can call cloud function in more simple way

    Add following line in your build.gradle

    implementation 'com.google.firebase:firebase-functions:19.0.2'
    

    And use following code

    FirebaseFunctions.getInstance() // Optional region: .getInstance("europe-west1")
        .getHttpsCallable("myCoolFunction")
        .call(optionalObject)
        .addOnFailureListener {
            Log.wtf("FF", it) 
        }
        .addOnSuccessListener {
            toast(it.data.toString())
        }
    

    You can use it on main thread safely. Callbacks is triggered on main thread as well.

    You can read more in official docs: https://firebase.google.com/docs/functions/callable

    0 讨论(0)
  • 2020-12-25 15:31

    Yes it's possible :

    1. Add this to app/build.gradle file :

      implementation 'com.google.firebase:firebase-functions:16.1.0'


    1. Initialize the client SDK

      private FirebaseFunctions mFunctions;

      mFunctions = FirebaseFunctions.getInstance();


    1. Call the function

      private Task<String> addMessage(String text) {
      
      Map<String, Object> data = new HashMap<>();
      data.put("text", text);
      data.put("push", true);
      
      return mFunctions
              .getHttpsCallable("addMessage")
              .call(data)
              .continueWith(new Continuation<HttpsCallableResult, String>() {
                  @Override
                  public String then(@NonNull Task<HttpsCallableResult> task) throws Exception {
                      // This continuation runs on either success or failure, but if the task
                      // has failed then getResult() will throw an Exception which will be
                      // propagated down.
                      String result = (String) task.getResult().getData();
                      return result;
                  }
              });
         }
      

    Ref : Calling Firebase cloud functions

    0 讨论(0)
提交回复
热议问题