名称为[DEFAULT]的FirebaseApp不存在错误

时间:2016-05-30 18:26:33

标签: android firebase android-service

您好我正在尝试获取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)

6 个答案:

答案 0 :(得分:8)

如果您的组件(最有可能的服务)不在应用程序的默认流程中,您必须手动初始化FirebaseApp,如下所示:

FirebaseApp.initializeApp(context, FirebaseOptions.fromResource(context));

在访问任何其他Firebase API之前执行此操作。

实施背景

每个进程都实例化自己的一组类。例如,每个进程都有自己的Application对象。因此,Application是一个进程中的单例

默认进程中的

FirebaseApp通过FirebaseInitProvider类初始化,该类是仅在默认进程中在应用程序启动创建的ContentProvider。 (清单中的<provider>元素会自动合并。)

请注意,<provider>元素属性android:multiprocess="true"无效,因为提供商本身没有想要与之互动的客户。

示例#1:Init Everywhere

如果您想在应用中的任何位置访问FirebaseApp,那么放置初始化代码的显而易见的地方就是您的Application课程。

try {
    FirebaseApp.getInstance()
} catch (IllegalStateException ex) {
    FirebaseApp.initializeApp(context, FirebaseOptions.fromResource(context));
}

我说“明显”不是“好”。我不知道这会影响单个Firebase服务(例如崩溃报告),或者即使在您不需要Firebase的流程中,此操作的资源密集程度也会如此。

示例#2:应用小部件(仅在需要时初始化)

根据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

enter image description here

答案 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文件,如果没有添加它和重建项目..