编辑:我应该强调,我有口味,我不想使用任何这些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);
到目前为止它似乎没有用。
非常感谢所有帮助!
答案 0 :(得分:11)
以下是关于如何在同一个Android项目中使用多个firebase应用/数据库的几个指针Firebase Blog和New Config Docs
然而,除了默认应用之外,这些关于使用辅助应用的讨论 - 仍然使用google-services.json。我做了一些研究,并在他们的Slack频道中探讨。 Firebase使用名为FirebaseInitProvider的ContentProvider。这使用google-services.json在启动时初始化DEFAULT应用。如果json文件不存在则barfs。我做了以下步骤:
通过清单合并添加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
。尝试并找出您需要哪些并不难。
一些链接: