web-dev-qa-db-fra.com

FirebaseApp ne s'initialise pas bien que FirebaseApp.initializeApp () ait été appelé dans la classe Application

Je crée une application Android et j'essaie actuellement de mettre en œuvre l'authentification des utilisateurs à l'aide de Firebase. Autant que je sache, mon application est connectée à mon serveur Firebase.

Une erreur d'exécution survient lorsque j'essaie de passer de l'activité SignIn à l'activité SignUp en appuyant sur un bouton. L'application se bloque et je rencontre une erreur d'exécution.

Pour autant que je sache, l'erreur d'exécution provient de l'appel onCreate() de l'activité SignUp lorsque je tente d'initialiser un objet FirebaseAuth avec FirebaseAuth.getInstance(). Cet appel échoue à cause de 

Java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process seniordesign.phoneafriend. Make sure to call FirebaseApp.initializeApp(Context).

Cependant, je passe cet appel dans la méthode onCreate() de ma classe Application, ce qui me convenait le mieux. J'ai ajouté l'appel initalizeApp() à l'appel onCreate() de SignUp, mais aucun dé. J'ai cherché d'autres personnes avec ce problème mais je n'ai rien trouvé de semblable. Merci pour toute aide.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="seniordesign.phoneafriend">
    <uses-permission Android:name="Android.permission.INTERNET" />
    <application
        Android:allowBackup="true"
        Android:icon="@mipmap/ic_launcher"
        Android:label="@string/app_name"
        Android:supportsRtl="true"
        Android:theme="@style/AppTheme"
        Android:name="seniordesign.phoneafriend.PhoneAFriend">
        <activity Android:name=".SignIn">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity Android:name=".SignUp"></activity>
    </application>

</manifest>

PhoneAFriend.Java (Ma classe d'application)

public class PhoneAFriend extends Application {

    public void onCreate(){
        super.onCreate();
        Firebase.setAndroidContext(this);
        FirebaseApp.initializeApp(this);
    }
}

SignUp.Java

public class SignUp extends AppCompatActivity {
    protected Firebase ref;
    protected EditText emailText;
    protected EditText passText;
    protected EditText confirmText;
    protected Button button;
    protected SignUp thisContext;

    protected FirebaseAuth auth;
    protected FirebaseAuth.AuthStateListener authListener;
    private View.OnClickListener onClickListener;

    public static Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_signup);
        ref = new Firebase("https://phoneafriend-7fb6b.firebaseio.com");
        emailText = (EditText) findViewById(R.id.signup_emailText);
        passText = (EditText) findViewById(R.id.signup_passwordText);
        confirmText = (EditText) findViewById(R.id.signup_passwordConfirm);
        intent = new Intent(this, SignIn.class);
        //Tried this already
        //FirebaseApp.initializeApp(this);
        auth = FirebaseAuth.getInstance();


        button = (Button) findViewById(R.id.signup_button);
        onClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                createUser(view);
                Log.v("SignUp Button" , "Clicked; Attempting to create user");
            }
        };
        button.setOnClickListener(onClickListener);

        authListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged( FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                    Log.d("FirebaseAuth", "onAuthStateChanged:signed_in:" + user.getUid());
                } else {
                    // User is signed out
                    Log.d("FirebaseAuth", "onAuthStateChanged:signed_out");
                }
                // ...
            }
        };
        thisContext = this;

    }
    @Override
    public void onStart(){
        super.onStart();
        //auth.addAuthStateListener(authListener);
    }

    @Override
    public void onStop(){
        super.onStop();
        if(authListener != null) {
            //auth.removeAuthStateListener(authListener);
        }
    }

    protected void createUser(View view){
        String cString = null;
        String pString = null;
        String eString  = emailText.getText().toString();
        if(passText.getText() != null && confirmText.getText() != null) {
            pString = passText.getText().toString();
            cString = confirmText.getText().toString();
            Log.v("SignUP: Pass Null check" , "Pass" );
            if (emailText.getText() != null && pString.equals(cString) && passText.getText() != null) {
                Log.v("SignUP: Sign up check " , "Pass");
                auth.createUserWithEmailAndPassword(emailText.getText().toString() , passText.getText().toString())
                        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {
                                Log.v("createUser complete" , "status: " + task.isSuccessful());
                                if(task.isSuccessful()){
                                    startActivity(SignUp.intent);
                                }
                            }

                        });

            }
        }

        return;
    }
}
14
The Alex

Comme indiqué par qbix, vous utilisez beaucoup les appels API de la version que vous allez utiliser. Si possible, vous devriez utiliser la nouvelle API car elle sera définitivement prise en charge dans le futur.

Voir les docs ici:

https://firebase.google.com/docs/database/Android/start/

Retirer:

Firebase.setAndroidContext(this);
FirebaseApp.initializeApp(this);

Et met:

FirebaseDatabase database = FirebaseDatabase.getInstance();

Si qbix met son commentaire en réponse, vous devez accepter le sien plutôt que le mien, vu comment il m'a battu de quelques minutes.

Également:

Si vous utilisez utilisez l'ancienne base de feu et que vous avez besoin d'aide pour changer de système, ce guide est complet et vous aidera à utiliser le commutateur. C'est un commutateur assez simple.

https://firebase.google.com/support/guides/firebase-Android

4
Ryan

Je sais qu'il y a déjà une réponse acceptée. Cependant, j'ai rencontré le même message d'erreur disant: Java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process (name). Make sure to call FirebaseApp.initializeApp(Context). J'ai essayé plusieurs solutions trouvées sur SO, et tout revérifié, jusqu'à ce que je découvre que le nom du package défini dans la console Firebase ne correspond pas à celui défini dans mon fichier manifeste.

Essayez d’aller dans votre console Firebase -> Paramètres du projet -> vérifiez si les noms de paquetages correspondent.

J'espère que ça peut aider certains :)

9
FJJ

La première vérification devrait être la documentation de Firebase et les outils de 

Android Studio -> Outils -> Firebase -> Messagerie dans le cloud.

Même si vous l'avez déjà fait.

Voir this , that et that

Encore une fois, même si vous l'aviez déjà fait avant, les versions de Firebase nécessitant généralement un JSON de configuration à jour.

0
Maneki Neko

Mettre à niveau classpath 'com.google.gms:google-services:4.1.0' à classpath 'com.google.gms:google-services:4.2.0' dans le projet Gradle a fonctionné pour moi.

0
nb2998

Après de nombreuses frustrations, l'activation des autorisations Internet a résolu ce problème. 

0
stepheaw

Il est plus facile d'utiliser l'assistant Firebase inclus dans Android Studio : ajoute toutes les dépendances dans les fichiers de dégradés, crée le projet firebase si nécessaire, connecte l'application au projet, etc.

Dans Android Studio, ouvrez menu Outils/Firebase et suivez les instructions.

Ensuite, FirebaseApp.initializeApp () renverra une valeur valide.

0
Arnaud SmartFun