【问题标题】:FirebaseApp with name [DEFAULT] doesn't exist getting error名称为 [DEFAULT] 的 FirebaseApp 不存在,出现错误
【发布时间】:2016-09-28 15:25:28
【问题描述】:

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

【问题讨论】:

  • 包括记录的错误
  • 我遇到了同样的问题,在他们更新 sdk 之前似乎没有任何帮助。如果您仍然遇到此问题,请更新到已解决此问题的 sdk 9.2.1。

标签: android firebase android-service


【解决方案1】:

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

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

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

实施背景

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

默认进程中的FirebaseApp 是通过FirebaseInitProvider 类初始化的,该类是在应用程序启动时创建的ContentProvider仅在默认进程中。 (manifest 中的&lt;provider&gt; 元素会自动合并。)

请注意,&lt;provider&gt; 元素属性 android:multiprocess="true" 将不起作用,因为提供者本身没有愿意与之交互的客户。

示例 #1:到处初始化

如果您想在应用程序中的任何位置访问FirebaseApp,则很明显可以放置初始化代码的位置是您的Application 类。

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

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

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

根据AppWidgetProvider docs,您可以在配置活动中创建小部件UI,也可以通过接收onUpdate 回调。这意味着您可能需要在这两个地方访问FirebaseApp。因此,在访问 firebase 之前,请在两者中调用示例 #1 中的代码。

【讨论】:

  • 如果组件不在应用默认进程中,为什么我们必须专门初始化 Firebase。在默认申请流程的情况下会发生什么。在这种情况下,Firebase 会在哪里初始化?
  • 感谢您的详细信息。当我尝试在主屏幕上托管应用程序小部件并且我的应用程序中的小部件在其自己的进程上运行时,我遇到了同样的问题。如果可能,请让我知道通过小部件初始化 FirebaseApp 的最佳位置。我无法在自定义应用程序类中对其进行初始化,因为对于应用程序,它会由 FirebaseInitProvider 自动初始化
  • 如果我在自定义应用程序类中添加以下代码会不会有任何问题: if (FirebaseApp.getApps(this).isEmpty()) { FirebaseApp.initializeApp(mContext, FirebaseOptions.fromResource(mContext) ); }
  • @SagarTrehan 在任何地方初始化 Fireabse 都是浪费的。仅在您真正需要时才这样做。请参阅更新答案中的示例 #2。
  • 感谢您的帮助。我正在尝试这个,如果有任何问题会告诉你
【解决方案2】:

在生命周期回调中实例化对象。

FirebaseDatabase database;
private ValueEventListener handler;
DatabaseReference myRef;

@Override
public void onCreate() {
    database = FirebaseDatabase.getInstance();
    myRef = database.getReference("chats");
    // etc.
}

【讨论】:

  • 我试过了。仍然有相同的错误..但是相同的方法正在其他类上运行而不是服务类
【解决方案3】:

确保您有 installed Firebase SDK correctly 并且您已添加该行:

apply plugin: 'com.google.gms.google-services'

在您的应用级别 build.gradle 文件的底部。然后重建项目,解决了我的问题。

【讨论】:

    【解决方案4】:

    根据Docs,我使用的服务应该不需要它,但是当我将 SHA-1 调试密钥添加到应用程序的在线设置时,这个问题得到了解决。单击设置齿轮-> 项目设置。然后在底部添加SHA1。请参阅here 获取调试 SHA1 指纹

    【讨论】:

    • 我遇到了同样的问题,这里似乎没有任何帮助。
    【解决方案5】:

    我可能会迟到,但你必须在你的appgradle 中添加这个

    apply plugin: 'com.google.gms.google-services'
    

    classpath 'com.google.gms:google-services:3.0.0'
    

    在您的项目级别 gradle。

    【讨论】:

      【解决方案6】:

      请检查是否在您的项目中添加了 google-services.json 文件,如果没有添加它并重新构建项目..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-17
        • 1970-01-01
        • 2019-12-04
        • 2016-12-07
        • 2021-10-17
        • 2017-04-25
        • 1970-01-01
        • 2019-07-09
        相关资源
        最近更新 更多