请务必先在Android中调用FirebaseApp.initializeApp(上下文)

时间:2017-08-31 09:22:25

标签: android firebase

我正面临这个问题,并在本网站上看到了一些答案,但没有得到任何适当的解决方案 我使用了以前版本的Firebase,但是当我尝试使用Upgradation进行升级并将Firebase类更新为DatabaseReference时,它显示错误并且无法正常工作。
我正在将我的清单文件添加到整个代码中,所以请帮我解决这个问题 这是我的manifest

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="firebasechat.com.firebasechat">

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:name=".Activity.SimpleBlog"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".Activity.RegisterActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

我的Module app如下所示。

    apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.0"
    defaultConfig {
        applicationId "firebasechat.com.firebasechat"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        multiDexEnabled  true

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE-FIREBASE.txt'
        exclude 'META-INF/NOTICE'
    }
}



dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.volley:volley:1.0.0'
compile "com.google.firebase:firebase-database:11.0.0"
compile 'com.google.android.gms:play-services:11.0.0'
compile 'com.android.support:recyclerview-v7:25.0.0'
testCompile 'junit:junit:4.12'
    testCompile 'junit:junit:4.12'
}

Project gradle

    // Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.google.gms:google-services:3.1.0'
    }
}
allprojects {
    repositories {
        jcenter()
        maven {
            url "https://maven.google.com" // Google's Maven repository
        }
    }
}
task clean(type: Delete) {
    delete rootProject.buildDir
}

以下是我的Activity

    public class RegisterActivity extends AppCompatActivity {

    EditText username, password;
    Button registerButton;
    String user, pass;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        username = (EditText)findViewById(R.id.username);
        password = (EditText)findViewById(R.id.password);
        registerButton = (Button)findViewById(R.id.registerButton);


          FirebaseApp.initializeApp(this);



        registerButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                user = username.getText().toString();
                pass = password.getText().toString();


                    final ProgressDialog pd = new ProgressDialog(RegisterActivity.this);
                    pd.setMessage("Loading...");
                    pd.show();

                    String url = "https://pure-coda-174710.firebaseio.com/users.json";

                    StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>(){
                        @Override
                        public void onResponse(String s) {

//                            Firebase reference = new Firebase("https://pure-coda-174710.firebaseio.com/users");
                            DatabaseReference reference = FirebaseDatabase.getInstance()
                                    .getReferenceFromUrl("https://pure-coda-174710.firebaseio.com/users");


                            if(s.equals("null")) {
                                reference.child(user).child("password").setValue(pass);
                                Toast.makeText(RegisterActivity.this, "registration successful", Toast.LENGTH_LONG).show();
                            }
                            else {
                                try {
                                    JSONObject obj = new JSONObject(s);

                                    if (!obj.has(user)) {
                                        reference.child(user).child("password").setValue(pass);
                                        Toast.makeText(RegisterActivity.this, "registration successful", Toast.LENGTH_LONG).show();
                                    } else {
                                        Toast.makeText(RegisterActivity.this, "username already exists", Toast.LENGTH_LONG).show();
                                    }

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }
                            }

                            pd.dismiss();
                        }

                    },new Response.ErrorListener(){
                        @Override
                        public void onErrorResponse(VolleyError volleyError) {
                            System.out.println("" + volleyError );
                            pd.dismiss();
                        }
                    });

                    RequestQueue rQueue = Volley.newRequestQueue(RegisterActivity.this);
                    rQueue.add(request);

            }
        });
    }
}

24 个答案:

答案 0 :(得分:32)

在您的SimpleBlog应用程序类中,使用onCreate()方法初始化FirebaseApp并将其从RegisterActivity中删除,以便将Firebase初始化为整个应用程序,而不仅仅是一项活动。

@Override
public void onCreate() {
    super.onCreate();
    FirebaseApp.initializeApp(this);
}

在app gradle结尾处添加apply plugin: 'com.google.gms.google-services'

dependencies {
    ....
}

apply plugin: 'com.google.gms.google-services'

需要插件来处理来自firebase的json配置并避免依赖性冲突。您可以阅读here了解更多详情。

答案 1 :(得分:32)

花了整整一天的时间。最后,这就是解决方案。

用0代替1,您将不必使用初始化firebaseapp或类似的东西。

在Project gradle中,使用Google服务: 4.0.0而不是4.1.0。

此外,根据我的经验,最后也不需要应用插件语句。

(希望您已从工具=> firebase助手中添加了firebase数据库。步骤1和步骤2正确且绿色。)

答案 2 :(得分:14)

遇到同样的问题并以这种方式解决:

活动:

@Override
public void onCreate() {
    super.onCreate();
    FirebaseApp.initializeApp(this);
}
在应用程序的gradle中(文件末尾)

dependencies {
    ....
}

apply plugin: 'com.google.gms.google-services'

是项目的助手:

   dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath 'com.google.gms:google-services:3.0.0'
}

答案 3 :(得分:11)

根据FirebaseApp文档,除了您的应用需要访问其他Firebase项目外,您无需调用此初始化。

我调用了这个初始化,有时,当用户打开我的应用程序时,用户会崩溃,所以我删除了这行代码,然后一切正常。 小心调用此初始化

捕获FirebaseApp文档:

enter image description here

更新:如果您尝试添加此行,则会发生异常[某些广告网络需要此行,他们还会在AndroidManifest中添加一些流程

无法获得对Firestore客户端脱机持久性的独占锁定。这通常意味着您在应用程序中使用来自多个进程的Firestore。请记住,多进程Android应用程序在所有进程中执行Application类中的代码,因此您可能需要避免在Application类中初始化Firestore。如果您故意在多个进程中使用Firestore,则只能在其中一个进程中启用脱机持久性(即调用setPersistenceEnabled(true))。

要修复它:

1)在Application课程中添加以下方法:

private boolean isMainProcess(Context context) {
    if (null == context) {
        return true;
    }
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

    int pid = android.os.Process.myPid();
    for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
        String name = processInfo.processName;
        if (!StringUtils.isEmpty(name) && pid == processInfo.pid && name.equals(APPLICATION_ID)) {
            return true;
        }
    }
    return false;
}

2)包裹onCreate

Application
@Override
public void onCreate() {
    super.onCreate();
    if (!isMainProcess(this)) {
        FirebaseApp.initializeApp(this);
        FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
                .setPersistenceEnabled(false)
                .build();
        FirebaseFirestore.getInstance().setFirestoreSettings(settings);
        // other things
        return;
    }
    // other things
}

更新:有时,我的应用会抛出异常

无法创建应用程序我的应用程序类:java.lang.IllegalStateException:默认FirebaseApp未在此过程中初始化MY_APPLICATION_ID。请务必先调用FirebaseApp.initializeApp(上下文)。

要修复它:让更新onCreate方法:

@Override
public void onCreate() {
    super.onCreate();
    FirebaseApp.initializeApp(this);
    boolean isMain = isMainProcess(this);
    FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder().setPersistenceEnabled(isMain).build();
    FirebaseFirestore.getInstance().setFirestoreSettings(settings);
    if (!isMain) {
        // other things
        return;
    }
    // other things
}

答案 4 :(得分:8)

  1. 我前段时间也遇到过同样的问题。

    您正尝试获取Firebase实例而不对其进行初始化。 在尝试获取的实例之前,请添加以下代码行 Firebase:

    只需导入最新版本的Firebase和Google Play服务。

    最新更新版本(示例):

添加到这些行build.gradle

dependencies {

    implementation 'com.google.firebase:firebase-messaging:17.3.4'
    implementation 'com.google.firebase:firebase-core:16.0.7'
    implementation 'com.firebase:firebase-jobdispatcher:0.8.5'


}
apply plugin: 'com.google.gms.google-services'



dependencies {
    classpath 'com.android.tools.build:gradle:3.3.1'
    classpath 'com.google.gms:google-services:4.2.0'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

仅此而已。享受您的编码。

答案 5 :(得分:4)

第一件事:项目配置JSON可能出错/过时主要是升级Firebase。

转到工具 - &gt; Firebase-&gt;云消息传递 - &gt;设置firebase云消息传递

即使您过去已经这样做了,但值得仔细检查here,因为事情会不时更新。我同步了我的项目,它解决了这个问题。

至于呼叫FirebaseApp.initializeApp,没有必要,至少不适用于FCM。请参阅FCM documentations

此外,如果它返回null,则表示它失败,因此在调用getInstance之前调用它是不行的。

请注意,这是FirebaseInstanceId的getInstance:

public static FirebaseInstanceId getInstance() {
    return getInstance(FirebaseApp.getInstance());
}

另一方面:

@Nullable
public static FirebaseApp initializeApp(Context var0) {
    Object var1 = sLock;
    synchronized(sLock) {
        if (zzf.containsKey("[DEFAULT]")) {
            return getInstance();
        } else {
            FirebaseOptions var2;
            return (var2 = FirebaseOptions.fromResource(var0)) == null ? null : initializeApp(var0, var2);
        }
    }
}

这意味着如果initializeApp返回null,您可能会遇到配置问题。至少 - 值得检查。要知道您所处的位置,请在Context可见的某个位置放置断点,并尝试评估FirebaseApp.initialize(context)以确保它不会返回null。

答案 6 :(得分:3)

我也遇到了同样的问题,并且我注意到只有在添加Firebase Storage依赖项时才出现此问题。 因此,当我使用API​​ 28时,我确保所有Firebase依赖项都具有相同的导入版本,即16.0.5和存储依赖项一样。

implementation 'com.google.firebase:firebase-core:16.0.5'
implementation 'com.google.firebase:firebase-auth:16.0.5'
implementation 'com.google.firebase:firebase-database:16.0.5'
implementation 'com.google.firebase:firebase-storage:16.0.5'

我将gradle版本更新为

classpath 'com.android.tools.build:gradle:3.3.0'
classpath 'com.google.gms:google-services:4.2.0'

我在应用模块下面添加了一行

apply plugin: 'com.google.gms.google-services'

然后对我有用。

答案 7 :(得分:2)

更新gradle主类路径'com.google.gms:google-services:4.2.0'

答案 8 :(得分:1)

为防止发生此错误,需要遵循为Android https://firebase.google.com/docs/android/setup设置Firebase的所有步骤

我遇到了相同的错误,因为我忘记遵循两个步骤并通过

进行了修复

1)将 classpath'com.google.gms:google-services:4.2.0'添加到项目级gradle构建文件中。

2)在模块级gradle构建文件中添加 apply插件:“ com.google.gms.google-services”

答案 9 :(得分:1)

请在项目的build.gradle中将Google Service插件从4.1.0版本降级到4.0.1

classpath 'com.google.gms:google-services:4.0.1'

并将此代码添加到onCreate()

FirebaseApp.initializeApp(this);

它为我工作。

答案 10 :(得分:1)

我遇到了同样的问题,我将Project build.gradle修改为如下

Annotation.js

然后我将以下行添加到应用模块

     dependencies {

    classpath 'com.android.tools.build:gradle:3.2.1'
    classpath 'com.google.gms:google-services:3.2.0'

....
                   }

问题解决了

答案 11 :(得分:0)

将这两行放在 build.gradle(应用级别)中

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services' 

enter image description here (这张图片取自 Firebase > Settings > Android App > Method of setting SDK

如果它是正确的,它会产生错误找不到文件 'google-services.json'

然后你复制你生成的 google-service.json 文件 Firebase > 设置 > Android 应用 > 点击“google-services.json”以生成文件。

您不必担心保存此文件的路径。 该错误将显示您需要在哪里保存此文件。 例如我保存在 app/ (旁边 build.gradle (应用程序级别))

答案 12 :(得分:0)

发生此错误是因为您没有使用最新版本的Firebase依赖项。

将所有依赖项更新为最新的依赖项,一切顺利!

答案 13 :(得分:0)

您正在使用非常古老的Firebase方法,现在您无需使用

***FirebaseApp.initializeApp(context)*** 

删除此内容。然后:

只需将带有包名称的App添加到Firebase项目中,下载google Json文件 通过此链接here 添加您的包名称,然后立即将下载的Google json文件复制到“应用程序”中

将指示库分为应用程序级别和项目级别。现在只需同步

项目,您就可以使用Firebase。

答案 14 :(得分:0)

迁移后,您必须将依赖项更新到新的SDK,请检​​查以下内容:https://stackoverflow.com/a/61681739/5279996

答案 15 :(得分:0)

尝试将您的应用添加到Firebase控制台,并更新应用中的新google-services.json文件。当我尝试使用另一个项目的数据库和json文件实现该应用程序时,这对我有用。

答案 16 :(得分:0)

使用 Kotlin,

<块引用>

"确保首先调用 FirebaseApp.initializeApp(Context) 安卓”

这是一个正确的 Firebase Analytics 初始化示例:

// declare_analytics
private lateinit var firebaseAnalytics: FirebaseAnalytics



class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        // Obtain the FirebaseAnalytics instance.
        firebaseAnalytics = Firebase.analytics


        val parameters = Bundle().apply {
            this.putString("level_name", "Jorgesys B. " + System.currentTimeMillis())
            this.putInt("level_difficulty", 10)
        }

        firebaseAnalytics.setDefaultEventParameters(parameters)


    }

答案 17 :(得分:0)

由于google updata,您遇到此错误,您只需执行以下操作

更改以下依赖项
dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'com.google.gms:google-services:4.1.0'
    }

 dependencies {
            classpath 'com.android.tools.build:gradle:3.3.2'
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
            classpath 'com.google.gms:google-services:4.0.0'
        }

不同之处在于google-services:4.1.0应该更改为4.0.0

答案 18 :(得分:0)

我没有在项目中使用FirebaseApp.initializeApp(Context)

对我有用。您应该检查gradle文件并确保实现了以下行:

apply plugin: 'com.google.gms.google-services'添加到您的gradle(app)

将此classpath 'com.google.gms:google-services:4.2.0'添加到您的gradle(项目)中。

答案 19 :(得分:0)

无需在Application类中添加任何内容,也无需为firebase调用initializeApp()。通过工具-> Firebase->(任何功能)->将Firebase功能添加到您的应用后,请确保第1步和第2步为绿色并选中。

转到项目gradle文件并使用 classpath 'com.google.gms:google-services:4.2.0'

就是这样。

答案 20 :(得分:0)

尝试降级或升级Gradle版本。

例如,您的build.gradle具有:

dependencies {
    classpath 'com.android.tools.build:gradle:3.3.0'
}

更改为

dependencies {
    classpath 'com.android.tools.build:gradle:3.2.0'
}

答案 21 :(得分:0)

implementation 'com.google.firebase:firebase-core:16.0.6

如果错误FirebaseApp.initializeApp(Context)在build.gradle中添加“ mavenCentral”

enter code here repositories {google() jcenter() mavenCentral() }

答案 22 :(得分:-1)

此错误是由于Google服务和Firebase身份验证更新

只需更新它们即可。

简单地

classpath 'com.google.gms:google-services:4.1.0'

对此

classpath 'com.google.gms:google-services:4.2.0'

以后希望获得更好,更快的解决方案

This is how you can update both firebase-auth and google-service

答案 23 :(得分:-5)

在使用firebase的类的oncreate中使用它。

FirebaseApp.initializeApp(Context);