Firebase使用谷歌登录时不会找到用户ID

时间:2017-12-03 11:26:10

标签: android firebase firebase-authentication google-signin

我已经使用firebase将google登录到我的应用中。但是当我使用谷歌登录时,它会正常登录,然后在我的主要活动中崩溃,因为我需要用户ID并且xant发现它在我的日志中发现此错误

java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference

如果我使用电子邮件登录,然后使用Google帐户登录,则会从电子邮件中删除我的密码,并且不允许我再次使用我的电子邮件进行身份验证,除非我删除了我的帐户。

我的登录代码是

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //hides keyboard on start;
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    setContentView(com.example.harrops.h20droidapp2.R.layout.activity_login);
    Intent intent = new Intent(Login.this, UpdateService.class);
    startService(intent);
    mAuth = FirebaseAuth.getInstance();
    cbrememberme = (CheckBox) findViewById(R.id.cbrememberme);
    mgo = (Button) findViewById(R.id.btnsubmit);
    mgo.setText("Login");
    memail = (EditText) findViewById(R.id.etemail);
    mpass = (EditText) findViewById(R.id.etpass);
    mforgot = (TextView) findViewById(R.id.tvforgotpass);
    mreset = (Button) findViewById(R.id.btnreset);
    mmember = (CheckBox) findViewById(R.id.cbexisiting);
    loginPreferences = getSharedPreferences("loginPrefs", MODE_PRIVATE);
    loginPrefsEditor = loginPreferences.edit();

    saveLogin = loginPreferences.getBoolean("saveLogin", false);
    if (saveLogin == true) {
        memail.setText(loginPreferences.getString("username", ""));
        mpass.setText(loginPreferences.getString("password", ""));
        cbrememberme.setChecked(true);
        signinnorm();
    }

    mmember.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (mmember.isChecked() == false) {
                mgo.setText("Sign in");
                memail.setHint("Sign up with a a valid email address");

            } else {
                mgo.setText("Register");
                mpass.setHint("Enter new password");
            }
        }
    });

    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build();

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();
    SignInButton signInButton = (SignInButton) findViewById(R.id.sign_in_button);

    findViewById(R.id.sign_in_button).setOnClickListener(this);
    signInButton.setSize(SignInButton.SIZE_STANDARD);

    mreset.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mreset.setVisibility(View.GONE);
            mpass.setVisibility(View.VISIBLE);
            ResetPassword();
        }
    });

    mforgot.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mpass.setVisibility(View.GONE);
            mreset.setVisibility(View.VISIBLE);


        }
    });
    mgo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!mmember.isChecked()) {
                signinnorm();

            } else {
                signup();
            }
        }
    });
}

private void signup() {
    String email;
    String password;
    email = memail.getText().toString().trim();
    password = mpass.getText().toString().trim();
    if (TextUtils.isEmpty(email) || TextUtils.isEmpty(password)) {

        memail.setHint(getString(R.string.ENTERYOUREMAIL));
        memail.setHintTextColor(RED);

        mpass.setHint(getString(R.string.ENTERYOURPASSWORD));
        mpass.setHintTextColor(RED);
    } else {


        mAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            // Sign in success, update UI with the signed-in user's information
                            Log.d(TAG, "createUserWithEmail:success");
                            FirebaseUser user = mAuth.getCurrentUser();
                            mmember.setChecked(false);
                            cbrememberme.setChecked(true);
                            Toast.makeText(Login.this, "Thanks for signing up. click login in to continue", Toast.LENGTH_SHORT);

                            ;
                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w(TAG, "createUserWithEmail:failure", task.getException());
                            Toast.makeText(Login.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();

                        }
                    }
                });
    }
}

private void signinnorm() {
    String email = memail.getText().toString().trim();
    String password = mpass.getText().toString().trim();
    if (cbrememberme.isChecked()) {
        loginPrefsEditor.putBoolean("saveLogin", true);
        loginPrefsEditor.putString("username", email);
        loginPrefsEditor.putString("password", password);
        loginPrefsEditor.commit();
    } else {
        loginPrefsEditor.clear();
        loginPrefsEditor.commit();

    }
    if (TextUtils.isEmpty(email) || TextUtils.isEmpty(password)) {

        memail.setHint(getString(R.string.ENTERYOUREMAIL));
        memail.setHintTextColor(RED);

        mpass.setHint(getString(R.string.ENTERYOURPASSWORD));
        mpass.setHintTextColor(RED);
    } else {
        mAuth.signInWithEmailAndPassword(email, password)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            // Sign in success, update UI with the signed-in user's information
                            Log.d(TAG, "signInWithEmail:success");
                            FirebaseUser user = mAuth.getCurrentUser();
                            startActivity(new Intent(Login.this, MainActivity.class));
                            finish();

                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w(TAG, "signInWithEmail:failure", task.getException());
                            Toast.makeText(Login.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                        }
                    }
                });
    }
}

private void ResetPassword() {
    FirebaseAuth auth = FirebaseAuth.getInstance();
    String emailAddress;
    emailAddress = memail.getText().toString().trim();

    auth.sendPasswordResetEmail(emailAddress)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Email sent.");
                    }
                }
            });
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.sign_in_button:
            signIn();
            break;
    }
}

private void signIn() {
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
    startActivityForResult(signInIntent, RC_SIGN_IN);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        handleSignInResult(result);
    }
}

private void handleSignInResult(GoogleSignInResult result) {

    if (result.isSuccess()) {
        GoogleSignInAccount account = result.getSignInAccount();
        firebaseAuthWithGoogle(account);
        startActivity(new Intent(Login.this, MainActivity.class));


    } else {
        // Signed out, show unauthenticated UI.

    }
}

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());

    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCredential:success");
                        FirebaseUser user = mAuth.getCurrentUser();

                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        Toast.makeText(Login.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();

                    }

                    // ...
                }
            });
}

然后在我的主要活动中,我调用用户id在oncreate中调用此方法

 private void GetUser_Firebase() {
    user = FirebaseAuth.getInstance().getCurrentUser();
    userid = user.getUid();
    DatabaseReference ref1 = mrootRef.getReference();
    mloggedinas = (TextView) findViewById(R.id.tvloggedin);

    ref1.child("User").child(userid).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String m = dataSnapshot.child("screenname").getValue(String.class);
            if (m == null) {
                Toast.makeText(MainActivity.this, "Please fill in the above fields", Toast.LENGTH_LONG).show();
                startActivity(new Intent(MainActivity.this, Edit_profile.class));
            } else {
                mloggedinas.setText(m);
            }
        }

EDIT ******     我可以在我的主要活动上使用此方法而不是登录活动吗? 这是来自firebase网站?

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());

    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCredential:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        Toast.makeText(GoogleSignInActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }

                    // ...
                }
            });
}

1 个答案:

答案 0 :(得分:0)

通过在注册时调用get user id方法而不是我的主要活动来解决没有它的问题。

我把它放在google auth方法onSuccess