我正在尝试手动初始化FirebaseAppApplication但遇到此错误.
public class BaseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
FirebaseOptions firebaseOptions = new FirebaseOptions.Builder()
.setDatabaseUrl("[DATABASE_URL]")
.setApiKey("API_KEY")
.setApplicationId("PROJECT_ID").build();
FirebaseApp.initializeApp(getApplicationContext(),firebaseOptions);
if (!FirebaseApp.getApps(this).isEmpty()) {
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
}
Run Code Online (Sandbox Code Playgroud)
假设我相应地设置了firebaseOptions值.我期待这将为其设定价值FirebaseApp.
我错过了什么吗?FirebaseApp文档
FirebaseInitProvider在应用启动时初始化默认应用实例.这通过Gradle清单合并添加到应用程序的清单中.如果应用程序使用不同的构建系统,则需要将提供程序手动添加到应用程序的清单中.
或者,initializeApp(Context,FirebaseOptions)初始化默认的应用程序实例.应该从Application调用此方法.如果在应用程序的主进程之外使用它,这也是必要的.
FATAL EXCEPTION: main
Process: com.sample.android, PID: 5490
java.lang.RuntimeException: Unable to create application com.android.tools.fd.runtime.BootstrapApplication: java.lang.IllegalStateException: FirebaseApp name [DEFAULT] already exists!
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4331)
at android.app.ActivityThread.access$1500(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:801)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:617)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: FirebaseApp name [DEFAULT] already exists!
at com.google.android.gms.common.internal.zzab.zza(Unknown Source)
at com.google.firebase.FirebaseApp.initializeApp(Unknown Source)
at com.sample.android.activities.BcodeApplication.onCreate(BcodeApplication.java:21)
at com.android.tools.fd.runtime.BootstrapApplication.onCreate(BootstrapApplication.java:369)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4328)
at android.app.ActivityThread.access$1500(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:801)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:617)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
Riy*_* PK 14
用这个
FirebaseOptions options = new FirebaseOptions.Builder()
.setApiKey(apiKey)
.setApplicationId(appId)
.setDatabaseUrl(firebaseBaseUrl)
.build();
boolean hasBeenInitialized=false;
List<FirebaseApp> firebaseApps = FirebaseApp.getApps(mContext);
for(FirebaseApp app : firebaseApps){
if(app.getName().equals(FirebaseApp.DEFAULT_APP_NAME)){
hasBeenInitialized=true;
finestayApp = app;
}
}
if(!hasBeenInitialized) {
finestayApp = FirebaseApp.initializeApp(mContext, options);
}
Run Code Online (Sandbox Code Playgroud)
Bob*_*der 10
目前尚不清楚你的目标是什么.如果您只想修改("覆盖")FirebaseApp由其创建的默认值FirebaseInitProvider,我认为这是不可能的.您引用的文档有点误导,因为它表明它是可能的.我认为该文档旨在描述默认应用程序尚未创建时的初始化方式,例如在辅助流程中.
您可以使用它FirebaseApp.initializeApp()来创建另一个 app对象.您需要使用接受应用程序名称参数的方法:
FirebaseOptions firebaseOptions = new FirebaseOptions.Builder()
.setDatabaseUrl("[DATABASE_URL]")
.setApiKey("API_KEY")
.setApplicationId("PROJECT_ID").build();
FirebaseApp myApp = FirebaseApp.initializeApp(getApplicationContext(),firebaseOptions,
"MyAppName");
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用created FirebaseApp来获取FirebaseDatabase,FirebaseStorage,FirebaseAuth,FirebaseCrash或FirebaseInstanceId的实例.例如:
FirebaseDatabase database = FirebaseDatabase.getInstance(myApp);
Run Code Online (Sandbox Code Playgroud)
在应用程序的主进程中,我认为没有一种简单的方法可以禁用初始化处理FirebaseInitProvider.如果要覆盖通常来自的配置参数,google-services.json可以使用Google Services Plugin 文档中的信息为参数创建自己的XML文件.它指出:
如果您的Android项目有一些阻止您使用google-services插件的配置,则可以使用这些值手动重新创建XML文件
我不知道它有多简单或可维护.
实际上,可以根据此处的这篇博客文章替换默认的 FirebaseApp 。
步骤如下: 1. 在 Android Manifest 中禁用 FirebaseInitProvider
<provider
android:name="com.google.firebase.provider.FirebaseInitProvider"
android:authorities="${applicationId}.firebaseinitprovider"
tools:node="remove"
/>
Run Code Online (Sandbox Code Playgroud)
2. 创建自己的ContentProvider,将其注册到AndroidManifest中。作为示例,您可以使用 FirebaseInitProvider。在内部,使用 FirebaseOptions 构建器创建 Firebase 默认应用。
FirebaseOptions.Builder builder = new FirebaseOptions.Builder()
.setApplicationId("1:0123456789012:android:0123456789abcdef")
.setApiKey("your_api_key")
.setDatabaseUrl("https://your-app.firebaseio.com")
.setStorageBucket("your-app.appspot.com");
FirebaseApp.initializeApp(this, builder.build());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13386 次 |
| 最近记录: |