【问题标题】:How to check if a Firebase App is already initialized on Android如何检查 Firebase 应用程序是否已在 Android 上初始化
【发布时间】:2016-10-05 18:14:41
【问题描述】:

使用以下内容,第一次调用它时它可以工作,但随后调用“FirebaseApp 名称 [DEFAULT] 已经存在!”时失败

public FirebaseDatabase conn(Context c) {
         FirebaseOptions options = new FirebaseOptions.Builder()
                .setApiKey("key")
                .setDatabaseUrl("url")
                .setApplicationId("ID")
                .build();


        /////I tried Try and Catch with no success//////
        FirebaseApp app = FirebaseApp.initializeApp(c, options);

        /// for this : FirebaseApp app = FirebaseApp.initializeApp(c, options, "some_app");
        //// will fail with "FirebaseApp name some_app already exists!"
        return FirebaseDatabase.getInstance(app);
}

以上所有内容都是尝试连接到第二个 Firebase 应用。

【问题讨论】:

    标签: java android google-api firebase firebase-realtime-database


    【解决方案1】:

    在 firebase web 上,您检查是否已经初始化:

    if (firebase.apps.length === 0) {
        firebase.initializeApp({});
    }
    

    【讨论】:

    • 很酷,但在 android 中这是不可能的
    • 我一直在使用从initializeApp() 返回的App,但是通过上述方法,这不再可能,所以我现在使用firebase.app('[DEFAULT]'),但我不确定是不是这样推荐。
    • 如果你想获得实例,你可以通过firebase.app();
    • 你能更新到 web 9 吗?
    【解决方案2】:

    在 v9 中,Firebase 进行了模块化,以便更好地摇树。所以我们不能再导入整个应用程序并检查apps 属性AFAIK。可以改用以下方法。

    import { initializeApp, getApps, getApp } from "firebase/app";
    getApps().length === 0 ? initializeApp(firebaseConfig) : getApp();
    

    https://firebase.google.com/docs/reference/js/v9/app.md#getapps 用于文档

    【讨论】:

      【解决方案3】:

      对于那些想知道如何在 Android 中与接受的答案相同的人:

      if (FirebaseApp.getApps(context).isEmpty()) {
          FirebaseApp.initializeApp(context);
      }
      

      在仪器化的测试环境中,使用以下上下文:

      InstrumentationRegistry.getContext()
      

      【讨论】:

        【解决方案4】:

        Firebase 版本 9

        import { initializeApp, getApp } from "firebase/app";
        
        const createFirebaseApp = (config = {}) => {
          try {
            return getApp();
          } catch () {
            return initializeApp(config);
          }
        };
        
        const firebaseApp = createFirebaseApp({/* your config */})
        

        【讨论】:

          【解决方案5】:

          您可以尝试获取 Firebase 应用实例,在它的代码中,firebase 检查它是否已初始化,如果未初始化,则抛出 IllegalStateException

              try{
                  FirebaseApp.getInstance();
              }
              catch (IllegalStateException e)
              {
                  //Firebase not initialized automatically, do it manually
                  FirebaseApp.initializeApp(this);
              }
          

          【讨论】:

            【解决方案6】:

            我认为您要做的是在初始化应用之前检查正在运行的应用列表。每个 SDK 都有一个获取这个数组的方法,在 android 中是 getApps:

            https://firebase.google.com/docs/reference/android/com/google/firebase/FirebaseApp.html

            然后您可以检查您的应用是否已经初始化。

            在我的例子中,我刚刚检查了数组的长度(我使用的是 javascript / web sdk,所以我确信它对于 Android 来说有点不同),如果它是 0,则初始化一个新应用程序。

            【讨论】:

              【解决方案7】:

              我遇到了类似的问题。 我通过删除已经初始化的应用解决了以下问题。

                  // Access your firebase app
                  let app = firebase.app();
                  // Delete your app.
                  app.delete(app);
              

              解决方案适用于网络。

              【解决方案8】:

              在 firebase admin SDK for java 中,当且仅当没有应用时才初始化应用。

              if (FirebaseApp.getApps().isEmpty()) {
                  FirebaseApp.initializeApp();
              }
              

              【讨论】:

                【解决方案9】:

                在 android 中不确定,但如何使用单例方法。在 JS 中你可以做到这一点。希望这可以帮助某人

                // Config file
                import * as firebase from "firebase";
                
                const config = {...};
                
                export default !firebase.apps.length ? firebase.initializeApp(config) : firebase.app();
                
                // Other file
                import firebase from '../firebase';
                

                【讨论】:

                  【解决方案10】:
                  import * as firebase from "firebase/app";
                  firebase.apps.map(e => e.name); // Give you an array of initialized apps
                  

                  【讨论】:

                    【解决方案11】:

                    对于使用 dotNet FirebaseAdmin SDK 的用户

                    if (FirebaseApp.GetInstance("[DEFAULT]") == null)
                    {
                        var createdApp = FirebaseApp.Create(new AppOptions()
                        {
                            Credential = GoogleCredential.FromFile("private-key.json")
                        });
                    }
                    

                    【讨论】:

                      【解决方案12】:

                      我遇到了类似的问题,我解决了如下:

                      1. 为应用创建一个 var 并用 null 初始化它
                      2. 在初始化时引用应用程序
                      3. 再次初始化前检查

                      //global variable
                      var firebaseResumeDownloadAdd = null;
                      
                      //inside function check before initializing
                      if(firebaseResumeDownloadAdd==null){
                         firebaseResumeDownloadAdd =
                         firebase.initializeApp(functions.config().firebase);
                      }
                      

                      【讨论】:

                        【解决方案13】:

                        在 Android 中,取决于 Daniel Laurindo 的回答:

                        if (FirebaseApp.getApps(context).size != 0) {
                        
                        } 
                        

                        【讨论】:

                          【解决方案14】:

                          ES6+ 更简洁的解决方案是

                          
                          if (!firebase.apps.length) {
                           ...
                          }
                          

                          【讨论】:

                            【解决方案15】:

                            简单使用 Java 8 Stream 和 Optional 特色。

                            以下代码为

                            FirebaseApp.getApps()
                            .stream()
                            .filter(firebaseApp -> 
                                firebaseApp.getName().equals("APP_NAME"))
                               .findFirst()
                               .orElseGet(() -> FirebaseApp.initializeApp(firebaseOptions, "APP_NAME"));
                            

                            【讨论】:

                              【解决方案16】:

                              如果您使用 Nativescript 构建适用于 Android 的混合移动应用程序 | iOS 你可以使用这个脚本:

                              import * as firebase from 'nativescript-plugin-firebase';
                              
                              _initFirebase(): Promise<any> {
                                  if (!(firebase as any).initialized) {
                                    return firebase.init({}).then(
                                      () => {
                                        console.info('firebase started...');
                                      },
                                      (error) => console.error(error)
                                    );
                                  }
                                }
                              
                              
                              

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 2017-06-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2014-08-19
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多