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

你爲什麼不救谷歌簽到令牌本地數據庫,每次用戶打開應用程序對用戶令牌進行檢查(可能在您的飛濺中),如果它存在,則表示已有用戶向配置文件活動發送意向。其他個人信息活動。