FirebaseApp名称[DEFAULT]已存在

时间:2016-08-27 22:38:34

标签: android firebase

我正在尝试在应用程序上手动初始化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值。 我希望这会为 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)  设置值。

我错过了什么吗? FirebaseApp Documentation

  

默认应用实例在app启动时初始化   FirebaseInitProvider。这由Gradle添加到应用程序的清单中   明显合并。如果应用程序使用不同的构建系统   需要手动将提供程序添加到应用程序的清单中。

     

或者,initializeApp(Context,FirebaseOptions)初始化   默认应用实例。应该从Application调用此方法。   如果它在应用程序的主要部分之外使用,这也是必要的   过程

{{1}}

8 个答案:

答案 0 :(得分:11)

使用此

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);
}

答案 1 :(得分:9)

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

可以使用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);

在应用程序的主要流程中,我不认为有一种简单的方法可以禁用FirebaseInitProvider完成的初始化处理。如果要覆盖通常来自google-services.json的配置参数,您可以使用documentation中针对Google服务插件的信息为参数创建自己的XML文件。它声明:

  

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

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

答案 2 :(得分:3)

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

步骤是: 1.在Android清单中禁用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 :(得分:2)

您可以检查它是否处于活动状态:

!firebase.apps.length ? firebase.initializeApp(config) : firebase.app();

答案 4 :(得分:1)

在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();                                                
        ...


    }

答案 5 :(得分:0)

我建议您在整个项目中搜索“ FirebaseApp.InitializeApp”,如果您正在学习教程或正在修改一个开源项目,则有可能已经在其他地方对其进行了初始化,并且特别忘记了它例如来自GitHub。

有时错误消息是如此简单,以至于我们忽略了它,因为错误表明“已经存在”,然后给它一个机会并进行搜索。

答案 6 :(得分:0)

我相信我了解您想要做的事情(您正在做多线程编程,对吗?我猜是空的)。我假设您希望每次运行特定线程时都采用一种自动的方法来添加新的FirebaseApp。 如果是这样的话。这就是我解决问题的方式。 我添加了一个随机生成器来命名。

这是我的代码:

SecureRandom random = new SecureRandom();
options = new FirebaseOptions.Builder()
                .setCredentials(credentials)
                .build();
        String name = String.valueOf(random.nextInt());
        FirebaseApp.initializeApp(options,name);
    db = FirestoreClient.getFirestore(FirebaseApp.getInstance(name));

答案 7 :(得分:0)

用 try 和 catch 包裹它。

try{
FirebaseApp.initializeApp(getApplicationContext(),firebaseOptions);
}catch(_){}