FirebaseApp名称[DEFAULT]已存在

yes*_*foe 11 android firebase

我正在尝试手动初始化FirebaseAppApplication但遇到此错误.

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

我错过了什么吗?FirebaseApp文档

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

或者,initializeApp(Context,FirebaseOptions)初始化默认的应用程序实例.应该从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) 
Run Code Online (Sandbox Code Playgroud)

Riy*_* PK 14

用这个

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);
}
Run Code Online (Sandbox Code Playgroud)


Bob*_*der 10

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

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

    FirebaseOptions firebaseOptions = new FirebaseOptions.Builder()
          .setDatabaseUrl("[DATABASE_URL]")
          .setApiKey("API_KEY")
          .setApplicationId("PROJECT_ID").build();

    FirebaseApp myApp = FirebaseApp.initializeApp(getApplicationContext(),firebaseOptions,
        "MyAppName");
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用created FirebaseApp来获取FirebaseDatabase,FirebaseStorage,FirebaseAuth,FirebaseCrashFirebaseInstanceId的实例.例如:

FirebaseDatabase database = FirebaseDatabase.getInstance(myApp);
Run Code Online (Sandbox Code Playgroud)

在应用程序的主进程中,我认为没有一种简单的方法可以禁用初始化处理FirebaseInitProvider.如果要覆盖通常来自的配置参数,google-services.json可以使用Google Services Plugin 文档中的信息为参数创建自己的XML文件.它指出:

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

我不知道它有多简单或可维护.

  • _>我认为有一种简单的方法可以禁用FirebaseInitProvider完成的初始化处理. (2认同)

che*_*711 6

实际上,可以根据此处的这篇博客文章替换默认的 FirebaseApp 。

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

<provider
    android:name="com.google.firebase.provider.FirebaseInitProvider"
    android:authorities="${applicationId}.firebaseinitprovider"
    tools:node="remove"
    />
Run Code Online (Sandbox Code Playgroud)

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());
Run Code Online (Sandbox Code Playgroud)