Как проверить, инициализировано ли приложение Firebase на Android

При следующем вызове в первый раз он работает, но затем происходит сбой при последующих вызовах с сообщением «Имя FirebaseApp [ПО УМОЛЧАНИЮ] уже существует!»

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.


person Relm    schedule 06.06.2016    source источник


Ответы (15)


В сети firebase вы проверяете, инициализированы ли вы уже с помощью:

if (firebase.apps.length === 0) {
    firebase.initializeApp({});
}
person Daniel Laurindo    schedule 06.12.2016
comment
Круто, но в андроиде это невозможно - person Vlad; 19.01.2018
comment
Я использовал App, возвращенный из initializeApp(), но с описанным выше подходом это больше невозможно, поэтому теперь я использую firebase.app('[DEFAULT]'), но я не уверен, что это рекомендуется. - person eoinmullan; 10.07.2020
comment
@eoinmullan это сработало для меня githubmemory.com/repo/firebase/firebase- js-sdk/issues/5037 - person Pumuckelo; 03.08.2021

Для тех, кто интересуется, как сделать то же самое, что и принятый ответ, в Android:

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

а в инструментированной тестовой среде используйте этот контекст:

InstrumentationRegistry.getContext()
person Nick Cardoso    schedule 05.06.2018

Вы можете попытаться получить экземпляр приложения Firebase, в его коде firebase проверяет, инициализировано ли оно, если нет, выдает IllegalStateException.

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

Я думаю, что вы хотите сделать, это проверить список запущенных приложений перед инициализацией вашего приложения. В каждом из SDK есть метод получения этого массива, в андроиде это getApps:

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

Затем вы можете проверить, инициализировано ли ваше приложение.

В моем случае я просто проверил длину массива (я использую javascript/web sdk, поэтому я уверен, что для Android он немного отличается) и инициализировал новое приложение, если оно равно 0.

person KCE    schedule 12.06.2016

В версии 9 Firebase был модульным для лучшего встряхивания дерева. Таким образом, мы больше не можем импортировать все приложение и проверять свойство apps, насколько мне известно. Вместо этого можно использовать приведенный ниже подход.

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

https://firebase.google.com/docs/reference/js/v9/app.md#getapps для документации

person Nitin    schedule 18.04.2021

Я столкнулся с подобной проблемой. Я решил следующую проблему, удалив уже инициализированное приложение.

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

Решение работает для Интернета.

person Manoj Pathak    schedule 19.12.2017
comment
больше не работает - github.com/zeit/next.js/ вопросы/1999#issuecomment-302244429 - person Anand Rockzz; 01.07.2019

В SDK администратора firebase для java инициализируйте приложение тогда и только тогда, когда приложение отсутствует.

if (FirebaseApp.getApps().isEmpty()) {
    FirebaseApp.initializeApp();
}
person Ratul Sharker    schedule 16.05.2021

Firebase версии 9

import { initializeApp, getApp } from "firebase/app";

const createFirebaseApp = (config = {}) => {
  try {
    return getApp();
  } catch () {
    return initializeApp(config);
  }
};

const firebaseApp = createFirebaseApp({/* your config */})
person Max Ma    schedule 03.07.2021

Не уверен в андроиде, но как насчет использования одноэлементного метода. В 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';
person rMili    schedule 02.02.2020

Я столкнулся с подобной проблемой, я решил ее следующим образом:

  1. Создайте переменную для приложения и инициализируйте ее нулевым значением.
  2. Возьмите ссылку на приложение во время инициализации
  3. Проверьте перед повторной инициализацией

//global variable
var firebaseResumeDownloadAdd = null;

//inside function check before initializing
if(firebaseResumeDownloadAdd==null){
   firebaseResumeDownloadAdd =
   firebase.initializeApp(functions.config().firebase);
}
person Harendra Kr. Jadon    schedule 11.10.2017

в Android, в зависимости от ответа Даниэля Лауриндо:

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

} 
person Mina Farid    schedule 28.03.2021

Более чистое решение для ES6+ — это


if (!firebase.apps.length) {
 ...
}
person mr3mo    schedule 14.06.2021

Простое использование Java 8 Stream и дополнительные функции.

Код ниже как

FirebaseApp.getApps()
.stream()
.filter(firebaseApp -> 
    firebaseApp.getName().equals("APP_NAME"))
   .findFirst()
   .orElseGet(() -> FirebaseApp.initializeApp(firebaseOptions, "APP_NAME"));
person Yasir Shabbir Choudhary    schedule 06.07.2021

Для тех, кто использует dotNet FirebaseAdmin SDK

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

Если вы используете 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)
      );
    }
  }


person edyrkaj    schedule 14.03.2020