您好我正在尝试获取Android背景服务的数据。但是我收到了这个错误。这是我的代码:
public class FirebaseBackgroundService extends Service {
FirebaseDatabase database = FirebaseDatabase.getInstance();
private ValueEventListener handler;
DatabaseReference myRef = database.getReference("chats");
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
handler = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
postNotify(dataSnapshot.getValue().toString());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
myRef.addValueEventListener(handler);
}
}
堆栈追踪:
java.lang.IllegalStateException: FirebaseApp with name [DEFAULT] doesn't exist.
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2862)
at android.app.ActivityThread.-wrap4(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1427)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalStateException: FirebaseApp with name [DEFAULT] doesn't exist.
at com.google.firebase.FirebaseApp.getInstance(Unknown Source)
at com.google.firebase.FirebaseApp.getInstance(Unknown Source)
at com.google.firebase.database.FirebaseDatabase.getInstance(Unknown Source)
at bagga2.example.com.liiv.services.FirebaseBackgroundService.<init>(FirebaseBackgroundService.java:30)
at java.lang.Class.newInstance(Native Method)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2859)
at android.app.ActivityThread.-wrap4(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1427)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
答案 0 :(得分:8)
如果您的组件(最有可能的服务)不在应用程序的默认流程中,您必须手动初始化FirebaseApp
,如下所示:
FirebaseApp.initializeApp(context, FirebaseOptions.fromResource(context));
在访问任何其他Firebase API之前执行此操作。
每个进程都实例化自己的一组类。例如,每个进程都有自己的Application
对象。因此,Application
是一个进程中的单例 。
FirebaseApp
通过FirebaseInitProvider
类初始化,该类是仅在默认进程中在应用程序启动创建的ContentProvider
。 (清单中的<provider>
元素会自动合并。)
请注意,<provider>
元素属性android:multiprocess="true"
无效,因为提供商本身没有想要与之互动的客户。
如果您想在应用中的任何位置访问FirebaseApp
,那么放置初始化代码的显而易见的地方就是您的Application
课程。
try {
FirebaseApp.getInstance()
} catch (IllegalStateException ex) {
FirebaseApp.initializeApp(context, FirebaseOptions.fromResource(context));
}
我说“明显”不是“好”。我不知道这会影响单个Firebase服务(例如崩溃报告),或者即使在您不需要Firebase的流程中,此操作的资源密集程度也会如此。
根据AppWidgetProvider docs
,您可以在配置活动中创建窗口小部件UI,也可以通过接收onUpdate
回调来创建窗口小部件UI。这意味着你可能需要访问这两个地方的FirebaseApp
。因此,在访问firebase之前,请先调用示例#1中的代码。
答案 1 :(得分:1)
在生命周期回调中实例化对象。
FirebaseDatabase database;
private ValueEventListener handler;
DatabaseReference myRef;
@Override
public void onCreate() {
database = FirebaseDatabase.getInstance();
myRef = database.getReference("chats");
// etc.
}
答案 2 :(得分:1)
请确保您已installed Firebase SDK correctly并且已添加以下行:
apply plugin: 'com.google.gms.google-services'
位于应用级build.gradle
文件的底部。然后重建项目,解决了我的问题。
答案 3 :(得分:0)
根据Docs,我使用的服务不应该是必需的,但是当我将SHA-1调试密钥添加到应用程序的在线设置时,此问题得以解决。点击Settings Gear - &gt;项目设置。然后在底部添加SHA1。请参阅here以获取Debug SHA1 Fingerprint
答案 4 :(得分:0)
我可能会迟到,但您必须在app
gradle
apply plugin: 'com.google.gms.google-services'
和
classpath 'com.google.gms:google-services:3.0.0'
在您的项目级别gradle。
答案 5 :(得分:0)
请检查项目中是否添加了google-services.json文件,如果没有添加它和重建项目..