1

我正在构建一个应用程序,用户必须先注册(谷歌或电子邮件)。第一次用户将被引导到他/她将输入他们的个人详细信息的活动,并且将返回的用户引导到配置文件活动。我正在使用Firebase身份验证和数据库。如何区分第一次谷歌登录和连续谷歌登录在Android应用程序?

如何检查用户是否已使用他的谷歌ID登录并将他引导至他的个人档案活动?现在,只要用户使用谷歌登录选项,即使他们之前已经注册,他们也总是被重定向到个人信息活动。

这是我与谷歌的主要活动登录的

public class MainActivity extends AppCompatActivity implements View.OnClickListener,GoogleApiClient.OnConnectionFailedListener{ 
private Button mainRegister; 
private TextView mainsignIn; 
private FirebaseAuth mAuth; 
private FirebaseAuth.AuthStateListener mAuthListener; 
private String TAG="MAIN_ACTIVITY"; 
private static int RC_SIGN_IN=0; 
private GoogleApiClient mGoogleApiClient; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mAuth = FirebaseAuth.getInstance(); 
    mainRegister=(Button)findViewById(R.id.mainregister); 
    mainsignIn=(TextView)findViewById(R.id.mainSignIN); 

    // googlebutton=(SignInButton)findViewById(R.id.mainGoogleSignin); 


    //Listener 
    mAuthListener=new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      FirebaseUser user = firebaseAuth.getCurrentUser(); 
      if(user != null){ 
       Log.d("AUTH", "User logged in: " + user.getEmail()); 

      }else{ 
       Log.d("AUTH", "User Logged out"); 
       } 
     } 
    }; 

    //google signIN 
    GoogleSignInOptions gso = 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,gso) 
      .build(); 

    mainRegister.setOnClickListener(this); 
    mainsignIn.setOnClickListener(this); 
    findViewById(R.id.mainGoogleSignin).setOnClickListener(this); 
} 

//googleSignIn Method 
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); 
     if (result.isSuccess()) { 
      // Google Sign In was successful, authenticate with Firebase 
      //uncomment this app crashes 
      GoogleSignInAccount account = result.getSignInAccount(); 
      firebaseAuthWithGoogle(account); 


     } else { 
      // Google Sign In failed, update UI appropriately 
      Log.d(TAG,"Google login Failed"); 
     } 
    } 
} 



//use this if app dosent work 
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) { 
        Log.d("AUTH", "signInWithCredential:onComplete:" + task.isSuccessful()); 
        finish(); 
        startActivity(new Intent(getApplicationContext(),PersonalDetailsActivity.class)); 

       } 
      }); 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    mAuth.addAuthStateListener(mAuthListener); 
} 
@Override 
public void onStop() { 
    super.onStop(); 
    if (mAuthListener != null) { 
     mAuth.removeAuthStateListener(mAuthListener); 
    } 
} 

@Override 
public void onClick(View v) { 
     if(v==findViewById(R.id.mainGoogleSignin)){ 
      signIn(); 
      //finish(); 
      //startActivity(new Intent(getApplicationContext(),ProfileActivity.class)); 
     } 
     if(v==mainRegister){ 
      finish(); 
      startActivity(new Intent(getApplicationContext(),EmailRegisterActivity.class)); 
     } 
     if(v==mainsignIn){ 
      finish(); 
      startActivity(new Intent(getApplicationContext(),SignInActivity.class)); 
     } 

} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
    Log.d(TAG,"Connection Failed"); 
} 

}

+0

请将相关的代码片段添加到您的问题。 – RamithDR

+0

http://stackoverflow.com/a/35286125/2949612 – pRaNaY

+0

为什么这被标记为重复?重复使用的是与用户问题无关的SharedPreferences。 – Michael

回答

0

你为什么不救谷歌签到令牌本地数据库,每次用户打开应用程序对用户令牌进行检查(可能在您的飞溅中),如果它存在,则表示已有用户向配置文件活动发送意向。其他个人信息活动。