2017-03-16 47 views
0

以下是我收到的错误堆栈。请帮忙。使用Firebase崩溃将Google SignIn集成到Android

致命异常:主 工艺:com.example.saisi.agni,PID:4249 显示java.lang.NullPointerException:尝试调用接口方法 “空隙 com.google.firebase.auth.FirebaseAuth $ AuthStateListener.onAuthStateChanged(com.google.firebase.auth.FirebaseAuth)' 空对象引用 at com.google.firebase.auth.FirebaseAuth $ 1.run(Unknown Source) at android.os.Handler.handleCallback(Handler .java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5539) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我的谷歌登入码:

import android.content.Intent; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.view.View; 
import android.widget.Toast; 

import com.google.android.gms.auth.api.signin.GoogleSignInAccount; 
import com.google.android.gms.auth.api.signin.GoogleSignInOptions; 
import com.google.android.gms.auth.api.signin.GoogleSignInResult; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.common.api.ResultCallback; 
import com.google.android.gms.common.api.Status; 
import com.google.android.gms.tasks.OnCompleteListener; 
import com.google.android.gms.tasks.Task; 
import com.google.firebase.auth.AuthCredential; 
import com.google.firebase.auth.AuthResult; 
import com.google.firebase.auth.FirebaseAuth; 
import com.google.android.gms.auth.api.Auth; 
import com.google.firebase.auth.FirebaseUser; 
import com.google.firebase.auth.GoogleAuthProvider; 


public class GoogleSignIn extends MainActivity implements 
GoogleApiClient.OnConnectionFailedListener, View.OnClickListener { 

private FirebaseAuth mFirebaseAuth; 
private FirebaseAuth.AuthStateListener mAuthStateListener; 
private GoogleApiClient mGoogleApiClient; 

public final static int RC_SIGN_IN = 1; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    findViewById(R.id.GoogleSignInButton); 
    GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestIdToken(getString(R.string.default_web_client_id)) 
      .requestEmail() 
      .build(); 

    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .enableAutoManage(this,this) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, googleSignInOptions) 
      .build(); 

    mFirebaseAuth = FirebaseAuth.getInstance(); 

    mAuthStateListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      FirebaseUser user = mFirebaseAuth.getCurrentUser(); 
      if (user!= null){ 
       //user is signed in 
       startActivity(new Intent(getApplicationContext(),UserProfile.class)); 
       finish(); 
      } 
      else { 
       //user is signed out 
       finish(); 
       startActivity(new Intent(getApplicationContext(),MainActivity.class)); 
      } 
     } 
    }; 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == RC_SIGN_IN){ 
     GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); 
     if (result.isSuccess()) { 
      // Google Sign In was successful, authenticate with Firebase 
      GoogleSignInAccount account = result.getSignInAccount(); 
      firebaseAuthWithGoogle(account); 
     } 
    } 

} 

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { 
    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); 
    mFirebaseAuth.signInWithCredential(credential) 
      .addOnCompleteListener(GoogleSignIn.this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
       if(task.isSuccessful()){ 
        Toast.makeText(getApplicationContext(),"User Registeration Successful",Toast.LENGTH_SHORT).show(); 
        startActivity(new Intent(getApplicationContext(),MoreUserDetails.class)); 
        finish(); 
       } 
       else 
       { 
        Toast.makeText(getApplicationContext(), "User registeration failed please try again",Toast.LENGTH_SHORT); 
       } 
       } 
      }); 
} 
private void signIn() { 
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); 
    startActivityForResult(signInIntent, RC_SIGN_IN); 
} 

private void signOut() { 
    // Firebase sign out 
    mFirebaseAuth.signOut(); 

    // Google sign out 
    Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
      new ResultCallback<Status>() { 
       @Override 
       public void onResult(@NonNull Status status) { 
        updateUI(null); 
       } 
      }); 
} 
private void updateUI(FirebaseUser user) { 
    if (user != null) { 

}} 



@Override 
public void onClick(View v) { 
    int i = v.getId(); 
    if (i == R.id.GoogleSignInButton) { 
     signIn(); 
    } 
} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
    Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show(); 
} 
} 
+0

张贴的代码显示mAuthStateListener'的'创作,但不显示它使用'addAuthStateListener加入到'mFirebaseAuth'()'。请更新您的帖子以显示该代码。 –

+0

如果要在'onStart()'中添加侦听器,是否在'onStop()'中删除它? –

+0

是的,即时将onStart中的监听器添加到我的主要活动中的onStop中并将其删除! –

回答

0

在onAuthState改变了你想用mFirebaseAuth获取当前用户。你应该改变它使用firebaseAuth:

FirebaseUser user = firebaseAuth.getCurrentUser();