我可以在不使用google-services.json的情况下初始化Firebase吗?

时间:2016-08-15 19:50:10

标签: android firebase firebase-remote-config

编辑:我应该强调,我有口味,我不想使用任何这些Google服务,并试图在这种情况下应用google-services插件,而没有适用的谷歌服务。 json,会导致构建失败。

我希望能够初始化Firebase SDK,特别是使用远程配置,不使用google-services.json。

我看到FirebaseApp有一个初始化方法,它接收一个FirebaseOptions对象。

我使用google-services.json中提供的值构建了FirebaseOptions,在使用这些选项调用FirebaseApp.initialize之后,我总是得到

FirebaseInitProvider: FirebaseApp initialization unsuccessful

我知道这是使用google-services.json文件的推荐方法,但我需要能够让应用程序调用不同的Firebase项目,具体取决于调试/发布版本,同时保持包名称相同。 / p>

我想这样做的方法是为初始化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);

到目前为止它似乎没有用。

非常感谢所有帮助!

4 个答案:

答案 0 :(得分:11)

以下是关于如何在同一个Android项目中使用多个firebase应用/数据库的几个指针Firebase BlogNew Config Docs

然而,除了默认应用之外,这些关于使用辅助应用的讨论 - 仍然使用google-services.json。我做了一些研究,并在他们的Slack频道中探讨。 Firebase使用名为FirebaseInitProvider的ContentProvider。这使用google-services.json在启动时初始化DEFAULT应用。如果json文件不存在则barfs。我做了以下步骤:

  • 删除了google-services.json
  • 删除了com.google.gms.google-services插件。此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的完美解决方案。任何进一步的指示将深表赞赏。

更新:

看起来这个解决方案毕竟有用 - 没有禁用FirebaseInstanceIdService,只是删除FirebaseInitProvider,如上所述。只需要确保Firebase.initializeApp在Application :: onCreate方法中调用了第一个东西。

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

答案 1 :(得分:2)

我找到了有趣的解决方法。请尝试以下方法: 将您的google-services.json放入任何示例应用google provides以进行Firebase集成。编译它。

查看路径app/build/generated/res/google-services/debug/values/应该生成values.xml文件,其中包含您所描述的错误中提到的一堆字符串。将这些字符串复制到项目的value.xml文件中。就是这样。

答案 2 :(得分:1)

我也在使用构建变体来为不同的环境应用不同的配置。 我遇到了同样的问题,因为某些变体在google-services.json文件上没有相应的条目。这导致我的一些构建在生成未在firebase中配置的应用程序包时失败。

我的解决方法是在firebase仪表板上为相关的firebase项目中的缺失包添加虚拟应用程序条目 - 然后从中获取更新的google-services.json文件。

可能不是最好的做法,但在我的情况下完成了工作。

答案 3 :(得分:0)

google-services.json完全是可选的,并且很方便。因此,如果您发现它不方便,那么绝对不要使用它。

您可能已经注意到,json文件仅在构建时使用。 google-services插件将JSON文件转换为包含某些特定字符串的资源xml文件。看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <! -- Present in all applications -->
    <string name="google_app_id" translatable="false">1:1035469437089:android:73a4fb8297b2cd4f</string>

    <! -- Present in applications with the appropriate services configured -->
    <string name="gcm_defaultSenderId" translatable="false">1035469437089</string>
    <string name="default_web_client_id" translatable="false">337894902146-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com</string>
    <string name="ga_trackingId" translatable="false">UA-65557217-3</string>
    <string name="firebase_database_url" translatable="false">https://example-url.firebaseio.com</string>
    <string name="google_api_key" translatable="false">AIzbSyCILMsOuUKwN3qhtxrPq7FFemDJUAXTyZ8</string>
    <string name="google_crash_reporting_api_key" translatable="false">AIzbSyCILMsOuUKwN3qhtxrPq7FFemDJUAXTyZ8</string>
    <string name="project_id" translatable="false">mydemoapp</string>

</resources>

您只需在自己的strings.xml文件中创建这些条目,然后FirebaseApp.initializeApp()将在运行时找到它们。并非所有键都是必需的,这取决于您使用的服务。例如,几乎所有服务都需要google_app_id键。 Firestore仅需要该名称和project_id,而Firebase Auth也需要google_api_key。尝试并找出您需要哪些并不难。

一些链接: