首页 文章

FirebaseApp名称[DEFAULT]已存在

提问于
浏览
6

我正在尝试在应用程序上手动初始化 FirebaseApp 但是收到此错误 .

public class BaseApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        FirebaseOptions firebaseOptions = new FirebaseOptions.Builder()
              .setDatabaseUrl("[DATABASE_URL]")
              .setApiKey("API_KEY")
              .setApplicationId("PROJECT_ID").build();
        FirebaseApp.initializeApp(getApplicationContext(),firebaseOptions);

        if (!FirebaseApp.getApps(this).isEmpty()) {
            FirebaseDatabase.getInstance().setPersistenceEnabled(true);
        }
    }

假设我相应地设置了 firebaseOptions 值 . 我期待这将为 FirebaseApp 设置值 .

我错过了什么吗? FirebaseApp Documentation

默认应用实例在应用启动时由FirebaseInitProvider初始化 . 这通过Gradle清单合并添加到应用程序的清单中 . 如果应用程序使用不同的构建系统,则需要将提供程序手动添加到应用程序的清单中 . 或者,initializeApp(Context,FirebaseOptions)初始化默认的app实例 . 应该从Application调用此方法 . 如果在应用程序的主进程之外使用它,这也是必要的 .

FATAL EXCEPTION: main
    Process: com.sample.android, PID: 5490
    java.lang.RuntimeException: Unable to create application com.android.tools.fd.runtime.BootstrapApplication: java.lang.IllegalStateException: FirebaseApp name [DEFAULT] already exists!
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4331)
    at android.app.ActivityThread.access$1500(ActivityThread.java:135)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5001)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:801)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:617)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.IllegalStateException: FirebaseApp name [DEFAULT] already exists!
    at com.google.android.gms.common.internal.zzab.zza(Unknown Source)
    at com.google.firebase.FirebaseApp.initializeApp(Unknown Source)
    at com.sample.android.activities.BcodeApplication.onCreate(BcodeApplication.java:21)
    at com.android.tools.fd.runtime.BootstrapApplication.onCreate(BootstrapApplication.java:369)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4328)
    at android.app.ActivityThread.access$1500(ActivityThread.java:135) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5001) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:801) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:617) 
    at dalvik.system.NativeStart.main(Native Method) 

4 回答

  • 1

    目前尚不清楚你的目标是什么 . 如果您只想修改 FirebaseInitProvider 创建的默认 FirebaseApp ("overwrite"),我认为不可能 . 您引用的文档有点误导,因为它表明它是可能的 . 我认为该文档旨在描述默认应用程序尚未创建时的初始化方式,例如在辅助流程中 .

    您可以使用 FirebaseApp.initializeApp() 创建另一个应用程序对象 . 您需要使用接受应用程序名称参数的方法:

    FirebaseOptions firebaseOptions = new FirebaseOptions.Builder()
              .setDatabaseUrl("[DATABASE_URL]")
              .setApiKey("API_KEY")
              .setApplicationId("PROJECT_ID").build();
    
        FirebaseApp myApp = FirebaseApp.initializeApp(getApplicationContext(),firebaseOptions,
            "MyAppName");
    

    然后,您可以使用创建的 FirebaseApp 来获取FirebaseDatabaseFirebaseStorageFirebaseAuthFirebaseCrashFirebaseInstanceId的实例 . 例如:

    FirebaseDatabase database = FirebaseDatabase.getInstance(myApp);
    

    在一个应用程序's main process, I don'中认为有一种简单的方法可以禁用 FirebaseInitProvider 完成的初始化处理 . 如果要覆盖通常来自 google-services.json 的配置参数,您可以使用documentation中针对Google Services Plugin的信息为参数创建自己的XML文件 . 它指出:

    如果您的Android项目有一些阻止您使用google-services插件的配置,则可以使用这些值手动重新创建XML文件

    我不知道那是多么简单或可维护 .

  • 6

    用这个

    FirebaseOptions options = new FirebaseOptions.Builder()
        .setApiKey(apiKey)
        .setApplicationId(appId)
        .setDatabaseUrl(firebaseBaseUrl)
        .build();
    
    boolean hasBeenInitialized=false;
    List<FirebaseApp> firebaseApps = FirebaseApp.getApps(mContext);
    for(FirebaseApp app : firebaseApps){
        if(app.getName().equals(FirebaseApp.DEFAULT_APP_NAME)){
            hasBeenInitialized=true;
            finestayApp = app;
        }
    }
    
    if(!hasBeenInitialized) {
        finestayApp = FirebaseApp.initializeApp(mContext, options);
    }
    
  • 9

    实际上,可以根据此博客文章here替换默认的FirebaseApp .

    步骤如下:1 . 在Android Manifest中禁用FirebaseInitProvider

    <provider
        android:name="com.google.firebase.provider.FirebaseInitProvider"
        android:authorities="${applicationId}.firebaseinitprovider"
        tools:node="remove"
        />
    

    2.创建您自己的ContentProvider,在AndroidManifest中注册它 . 作为示例,您可以使用FirebaseInitProvider . 在内部,使用FirebaseOptions构建器创建Firebase默认应用 .

    FirebaseOptions.Builder builder = new FirebaseOptions.Builder()
        .setApplicationId("1:0123456789012:android:0123456789abcdef")
        .setApiKey("your_api_key")
        .setDatabaseUrl("https://your-app.firebaseio.com")
        .setStorageBucket("your-app.appspot.com");
    FirebaseApp.initializeApp(this, builder.build());
    
  • 3

    在onCreate()中:

    ...                                                                    
          if (!checkInternet()) {
            showMessageDialog("Enable Internet connection please.", true);
            finish();
    
        } else {
    
            boolean hasBeenInitialized = false;
            List<FirebaseApp> fbsLcl = FirebaseApp.getApps(this);
            for (FirebaseApp app : fbsLcl) {
                if (app.getName().equals("SpeachGAPIMyTest")) {
                    hasBeenInitialized = true;
                }
            }
    
            FirebaseOptions options = new FirebaseOptions.Builder()
                    .setApiKey("AIzaSyA6172grz_K_jkhfvXsrUUiug9LwImK3sg26bE")//https://console.developers.google.com/apis/credentials?project=speachgapimytest-72e23
                    .setApplicationId("uz.my.speach.gapi")
                    .setDatabaseUrl("https://speachgapimytest-72e23.firebaseio.com/")
                    .build();
            if (!hasBeenInitialized) 
                fbApp = FirebaseApp.initializeApp(getApplicationContext(), options, "SpeachGAPIMaximTest"/*""*/);
            else
                fbApp = FirebaseApp.getInstance("SpeachGAPIMyTest");
            fbDB = FirebaseDatabase.getInstance(fbApp); 
    
            startAuthDialog();                                                
            ...
    
    
        }
    

相关问题