2016-08-15 5 views
8

EDIT: Я должен подчеркнуть, что у меня есть вкусы, для которых я не хочу использовать какие-либо из этих сервисов Google и пытаюсь применить плагин google-services в таком случае, не имея применимого google-services.json , приведет к сбою сборки.Можно ли инициализировать Firebase без использования google-services.json?

Я хотел был бы иметь возможность инициализировать SDK Firebase, в частности использовать Remote Config, БЕЗ использования google-services.json.

Я вижу, что FirebaseApp имеет метод инициализации, который получает объект FirebaseOptions.

Я построил FirebaseOptions со значениями, в Google-services.json, и после вызова FirebaseApp.initialize с этими вариантами, я всегда получаю

FirebaseInitProvider: FirebaseApp initialization unsuccessful 

Я знаю, что это рекомендуемый способ используйте файл google-services.json, но мне нужно, чтобы приложение вызывало различные проекты Firebase, в зависимости от сборки debug/release, сохраняя при этом имя пакета одинаковым.

Способ, которым я хотел бы сделать это, состоит в том, чтобы иметь пары отладки/выпуска для всех значений, необходимых для инициализации Firebase, а затем динамически выполнять инициализацию.

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

Пока это не работает.

Вся помощь очень признательна!

+0

Не ответ на ваш вопрос, но, возможно, полезно: документация для [Плагин Gradle Google Apps] (https://developers.google.com/android/guides/google-services-plugin#adding_the_json_file) объясняет, что вы может иметь несколько файлов 'google-services.json' для проекта для поддержки различных типов и вариантов сборки. –

+0

@qbix, спасибо, я обновил свой вопрос. Я знаю об этом, но проблема в том, что у меня есть некоторые вкусы, для которых я просто не хочу использовать какие-либо из этих сервисов Google, так как они мне не нужны. Если я еще не предоставил google-services.json, сборка завершится неудачно. – Matej

+0

Это сработало для меня: http://stackoverflow.com/questions/37634767/how-to-connect-to-more-than-one-firebase-database-from-an-android-app/37643374#37643374. Что не работает для вас? –

ответ

5

Вот пара указателей о том, как использовать несколько firebase приложений/баз данных в одном проекте андроида Firebase Blog и New Config Docs

Однако эти разговоры об использовании вторичного приложения в дополнении к приложению по умолчанию - который до сих пор используют в Google -services.json. Я немного поработал и проговорил в своем канале Slack. Firebase использует ContentProvider под названием FirebaseInitProvider. Это использует google-services.json для инициализации приложения DEFAULT при запуске. Это barfs, если json-файл отсутствует. Я сделал следующие шаги:

  • Убрана Google-services.json
  • Удалены com.google.gms.google-услуги плагин. Этот plugin всегда ищет файл json.
  • FirebaseInitProvider добавляется посредством слияния манифеста. Однако в манифесте верхнего уровня вы можете указать тег node = remove, чтобы удалить это из добавления в итоговый манифест.

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

Однако, даже после этого, я все еще вижу исключение:

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) 

Похоже FirebaseInstanceIdService все еще ищет приложения экземпляра. Если вы отключите службу, используя ту же технику удаления узла манифеста, это исключение исчезнет. Но я думаю, что эта служба выполняет важную синхронизацию/обмен сообщениями. Поэтому не уверен, что его разумно устранить. Короче говоря - я все еще ищу идеальное решение для отключения приложения по умолчанию/без использования google-services.json. Любые дальнейшие указатели будут глубоко оценены.

UPDATE:

Похоже, что это решение работает после того, как все - без отключения FirebaseInstanceIdService и просто удалением FirebaseInitProvider, как упоминалось выше. Просто нужно убедиться, что Firebase.initializeApp называется первым в методе Application :: onCreate.

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

Я пробовал это, и это не работает для меня. Какая версия Firebase это? – user1743524

+1

@ user1743524 Я пробовал это с версией 10.0.1 и, похоже, работает для меня. – exifguy

0

Я также использую варианты сборки для применения различных конфигураций для разных сред. У меня была та же проблема, что и некоторые из вариантов не имели соответствующей записи в файле google-services.json. что привело к сбою некоторых из моих сборок при создании пакета приложения, который не был настроен в firebase.

Мое обходное решение для этого заключалось в том, чтобы добавить фиктивные записи приложений для недостающих пакетов в соответствующие проекты firebase, на панели управления firebase, а затем получить от него обновленный файл google-services.json.

Не может быть лучшей практикой, но я сделал эту работу в своем случае.

1

Я нашел интересное обходное решение. Попробуйте следующее: введите google-services.json в любой пример приложения google provides для интеграции Firebase. Скомпилируйте его.

Посмотрите на путь app/build/generated/res/google-services/debug/values/ должен быть сгенерирован файл values.xml файл с кучей строк, упомянутых в описанных вами ошибках. Скопируйте эти строки в файл value.xml вашего проекта. Вот и все.

+1

Работал для меня тоже. Вы не должны забывать удалить «FirebaseInitProvider» из манифеста. – Dokumans