我有一个Android应用。它使用Firebase。我想根据Firebase数据库中的数据向用户发送通知。

我认为这是一个非常常见的用例,但是几乎所有教程都只是关于使用Firebase控制台手动发送通知的。我显然需要一台服务器来定期查看Firebase并启动这些通知。

我终于找到了有关如何执行此操作的教程:https://cloud.google.com/solutions/mobile/firebase-app-engine-android-studio
(该示例发送了一封电子邮件,但距离我已经足够接近,可以让Firebase和GCP互相交谈)

但是那里提供的代码有错误。具体来说,此位会导致空指针异常:

    FirebaseOptions options = new FirebaseOptions.Builder()
            .setServiceAccount("/WEB-INF/[my private key file].json")
            .setDatabaseUrl("https://[my firebase account].firebaseio.com/")
            .build();


我在这里收到500服务器错误:https://[my project ID].appspot.com/send-email

https://console.cloud.google.com上,我得到了:NullPointerException at setServiceAccount (FirebaseOptions.java:73)。日志清楚地表明问题是我上面所说的。

堆栈跟踪:

java.lang.NullPointerException
at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkNotNull (Preconditions.java:213)
at com.google.api.client.util.Preconditions.checkNotNull (Preconditions.java:127)
at com.google.api.client.util.ByteStreams.copy (ByteStreams.java:46)
at com.google.firebase.FirebaseOptions$Builder.setServiceAccount (FirebaseOptions.java:73)
at digital.simply.goalsandtasks.backend.MyServlet.doGet (MyServlet.java:88)
at javax.servlet.http.HttpServlet.service (HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service (HttpServlet.java:717)
...




所以我尝试了一些事情。

首先,我将有问题的Java代码更改为:

    InputStream in = Thread.currentThread().getContextClassLoader()
            .getResourceAsStream("/WEB-INF/[my private key file].json");

    FirebaseOptions options = new FirebaseOptions.Builder()
            .setServiceAccount(in)
            .setDatabaseUrl("https://[my firebase account].firebaseio.com/")
            .build();


但是在该.setServiceAccount(...行上我仍然出现错误。

其次,本教程还说通过将appengine-web.xml文件更新为以下内容来手动缩放项目:

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
   <application>myApplicationId</application>
   <version>1</version>
   <threadsafe>true</threadsafe>
   <manual-scaling>
       <instances>1</instances>
   </manual-scaling>
   <system-properties>
       <property name="java.util.logging.config.file" value="WEB-INF/logging.properties" />
   </system-properties>
</appengine-web-app>


尚不清楚,我应该将“ myApplicationId”更改为实际的GCP项目ID。

似乎都没有这样做。关于如何解决该空指针异常的任何想法?

最佳答案

除了本教程之外,我还必须做一些事情...

1)将我的专案名称更改为没有空格。
本教程提供的代码不适用于带空格的json私钥文件名。该名称来自“项目名称”。我所有尝试处理文件名字符串的尝试均失败。也许更好的Java开发人员可以找到一种方法。因此,我将现有的项目转储到了GCP控制台中并制作了一个新项目。挂钩的应用程序。

然后从教程将Java的那一部分更改回原始版本。像这样:

FirebaseOptions options = new FirebaseOptions.Builder()
        .setServiceAccount("/WEB-INF/[my private key file].json")
        .setDatabaseUrl("https://[my firebase account].firebaseio.com/")
        .build();


2)将自己添加为授权发件人
在控制台[https://console.cloud.google.com/]中,转到“设置”,然后添加我自己的真实Google帐户作为Email API授权的发件人。然后将reminder@[FIREBASE_PROJECT_ID].appspotmail.com替换为上述电子邮件地址。仍在尝试弄清楚如何使该别名成为“ reminder@mydomain.com”。

3)最后更新代码。
看来您只需按相同版本的Build > Deploy Module to App Engine...即可上传更新。

logging.properties中,我更改了这一行:

 # Set the default logging level for all loggers to WARNING
 .level = INFO


然后,我可以在这里阅读自己的日志:
https://console.cloud.google.com/logs/
这很有帮助。

无论如何。我希望有一天我可以避免其他笨手笨脚地尝试此工作。

再次将本教程称为:在Android App中使用Firebase和App Engine标准环境https://cloud.google.com/solutions/mobile/firebase-app-engine-android-studio

08-04 05:34
查看更多