2016-08-15 16 views
8

EDYCJA: Powinienem podkreślić, że mam smaki, dla których nie chcę korzystać z żadnej z tych usług Google, i próbuję zastosować wtyczkę usług Google w takim przypadku, bez konieczności stosowania google-services.json , spowoduje niepowodzenie kompilacji.Czy mogę zainicjować Firebase bez używania google-services.json?

Chciałbym móc zainicjować pakiet SDK Firebase, w szczególności do korzystania z konfiguracji zdalnej, BEZ korzystania z usługi google-services.json.

Widzę, że FirebaseApp ma metodę initialize, która odbiera obiekt FirebaseOptions.

Mam zbudował FirebaseOptions z wartościami zawartymi w Google services.json, a po wywołaniu FirebaseApp.initialize z tych opcji, zawsze dotrzesz

FirebaseInitProvider: FirebaseApp initialization unsuccessful 

wiem, że to zalecanym sposobem użyj pliku google-services.json, ale chcę, aby aplikacja mogła wywoływać różne projekty Firebase, w zależności od wersji debugowania/wydania, zachowując jednocześnie nazwę pakietu.

Sposób, w jaki chciałbym to zrobić, to posiadanie pary debugowania/wydania dla wszystkich wartości niezbędnych do zainicjowania Firebase, a następnie dynamiczne inicjowanie.

 FirebaseOptions options = new FirebaseOptions.Builder() 
       .setApplicationId(appId) 
       .setApiKey(apiKey) 
       .setGcmSenderId(appContext.getString(
         isDebug ? R.string.firebase_testing_gcm_sender_id : 
           R.string.firebase_production_gcm_sender_id)) 
       .setDatabaseUrl(appContext.getString(
         isDebug ? R.string.firebase_testing_database_url : 
           R.string.firebase_production_database_url)) 
       .setStorageBucket(
         appContext.getString(
           isDebug ? R.string.firebase_testing_storage_bucket : 
             R.string.firebase_production_storage_bucket)) 
       .build(); 
     FirebaseApp.initializeApp(appContext, options); 

Do tej pory nie działa.

Cała pomoc jest bardzo doceniana!

+0

Brak odpowiedzi na twoje pytanie, ale być może pomocne: Dokumentacja dla [wtyczki Google Services Gradle] (https://developers.google.com/android/guides/google-services-plugin#adding_the_json_file) wyjaśnia, że może mieć wiele plików 'google-services.json' dla projektu obsługującego różne typy i smaki kompilacji. –

+0

@qbix, dzięki, zaktualizowałem moje pytanie. Jestem tego świadomy, ale problem polega na tym, że mam kilka smaków, z których po prostu nie chcę korzystać z żadnej z tych usług Google, ponieważ ich nie potrzebuję. Jeśli nie udostępnię jeszcze usługi google-services.json, kompilacja się nie powiedzie. – Matej

+0

To działało dla mnie: http://stackoverflow.com/questions/37634767/how-to-connect-to-more-than-one-firebase-database-from-an-android-app/37643374#37643374. Co nie działa dla ciebie? –

Odpowiedz

5

Oto kilka wskazówek, w jaki sposób korzystać z wielu Firebase apps/baz danych w tym samym android projektu Firebase Blog i New Config Docs

Jednak te rozmowy na temat korzystania z aplikacji wtórnego oprócz domyślnej aplikacji - który nadal korzysta z Google -services.json. Zrobiłem trochę badań i grzebałem w ich kanale Slack. Firebase używa ContentProvider o nazwie FirebaseInitProvider. Korzysta z usługi google-services.json do inicjowania aplikacji DEFAULT podczas uruchamiania. Barfs, jeśli plik json nie jest obecny. Zrobiłem następujące kroki:

  • usunął google-services.json
  • Usunięto com.google.gms.google-usług wtyczki. Ten plugin zawsze szuka pliku json.
  • FirebaseInitProvider jest dodawany poprzez scalanie manifestów. Jednak w manifeście na najwyższym poziomie możesz określić znacznik węzeł = remove, aby usunąć go z ostatecznego manifestu.

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

Jednak nawet po tym, wciąż widzę wyjątek:

java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process myfirebasedemo.net. Make sure to call FirebaseApp.initializeApp(Context) first. 
                   at com.google.firebase.FirebaseApp.getInstance(Unknown Source) 
                   at com.google.firebase.iid.FirebaseInstanceId.getInstance(Unknown Source) 
                   at com.google.firebase.iid.FirebaseInstanceIdService.zza(Unknown Source) 
                   at com.google.firebase.iid.FirebaseInstanceIdService.zzm(Unknown Source) 
                   at com.google.firebase.iid.zzb$2.run(Unknown Source) 
                   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
                   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
                   at java.lang.Thread.run(Thread.java:818) 

Wygląda FirebaseInstanceIdService nadal szuka aplikacji instancji. Jeśli wyłączysz usługę przy użyciu tej samej techniki usuwania węzła manifestu, ten wyjątek zniknie. Ale myślę, że ta usługa wykonuje ważne czynności związane z synchronizacją/wiadomościami. Więc nie jestem pewien, czy to mądre, aby to usunąć. Krótko mówiąc - wciąż szukam idealnego rozwiązania do wyłączania domyślnej aplikacji/nie używania google-services.json. Wszelkie dalsze wskazówki będą głęboko docenione.

UPDATE:

Wygląda na to rozwiązanie działa po wszystkim - bez wyłączania FirebaseInstanceIdService i po prostu usuwając FirebaseInitProvider jak wspomniano powyżej. Wystarczy się upewnić, że Firebase.initializeApp wywołało pierwszą rzecz w metodzie Application :: onCreate.

FirebaseApp.initializeApp(context, new FirebaseOptions.Builder().setApiKey("<VAL>"). 
        setApplicationId("<VAL>"). 
        setDatabaseUrl("<VAL>"). 
        setGcmSenderId("<VAL>"). 
        setStorageBucket("<VAL>").build()); 
+0

Próbowałem tego i to nie działa dla mnie. Jaka jest wersja Firebase? – user1743524

+1

@ user1743524 próbowałem to z wersji 10.0.1 i wydaje się działać dla mnie. – exifguy

0

Używam również wariantów kompilacji do stosowania różnych konfiguracji dla różnych środowisk. Miałem ten sam problem, ponieważ niektóre warianty nie miały odpowiedniego wpisu w pliku google-services.json. które spowodowały awarię niektórych moich kompilacji podczas generowania pakietu aplikacji, który nie był skonfigurowany w bazie firebase.

Moje obejście tego problemu polegało na dodaniu pozornych zgłoszeń do brakujących pakietów w odpowiednich projektach bazy ogniowej, na pulpicie dna pulpitu, a następnie pobranie z niego zaktualizowanego pliku google-services.json.

Może nie być najlepszą praktyką, ale wykonałem pracę w moim przypadku.

1

Znalazłem interesujące obejście. Wypróbuj następujące rozwiązania: umieść swój numer google-services.json w dowolnej przykładowej aplikacji google provides w celu integracji z Firebase. Skompiluj to.

Zobacz ścieżkę app/build/generated/res/google-services/debug/values/ należy wygenerować plik values.xml zawierający kilka ciągów wymienionych w opisywanych błędach. Skopiuj te łańcuchy do pliku value.xml projektu. to jest to!

+1

Pracował także dla mnie. Nie zapomnij usunąć pliku 'FirebaseInitProvider' z manifestu. – Dokumans

Powiązane problemy