我有一个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