Google +仅适用于第二次登录尝试

时间:2018-04-03 16:50:05

标签: java android api google-plus google-login

我已经实施了谷歌+登录到我的Android应用程序(这很痛苦),并试图使用用户登录信息。一旦用户登录,我要求他们填写剩余的字段。现在的问题是,第一次登录我得到一个空用户。一旦我第二次登录该信息,如果被授予。请看一下我的代码并向我证明我应该在哪里看。

public class SignInOptionsActivity extends AppCompatActivity {

// For the regular registration

private UserViewModel userViewModel;
@Inject
UserViewModelFactory userViewModelFactory;

String firstName= " ", lastName= " ", birthYear= " ", email= " ", genderString= " ";
String FBTAG= LogTags.LOG_IN;
String GTAG= LogTags.LOG_IN;

private FirebaseAnalytics mFirebaseAnalytics;
FirebaseAuth mAuth;
public FirebaseUser user= null;


private static final int RC_SIGN_IN = 123;
GoogleSignInClient mGoogleSignInClient;

String phoneNumber;
double latitude;
double longitude;


//TODO: What is this for?
CallbackManager callbackManager = CallbackManager.Factory.create();

private void injectDependencies() {
    ButterKnife.bind(this);
    ((AdMe360Application) getApplication()).getAppComponent().inject(this);
    userViewModel = ViewModelProviders.of(this, userViewModelFactory).get(UserViewModel.class);
}
private void register(String phoneNo, String email, String firstName, String lastName, String dateOfBirth, String timeZone, String gpsLocation, int genderId){
    userViewModel.registerNewUser(phoneNo, email, firstName, lastName, dateOfBirth, timeZone, gpsLocation, genderId);
}
private void registerObservers() {
    userViewModel.getRegisterUserResponse().observe(this, userRegistrationObserver);
}
private Observer<RegisterUserResponse> userRegistrationObserver = new Observer<RegisterUserResponse>() {
    @Override
    public void onChanged(@Nullable RegisterUserResponse registerUserResponse) {
        int returnCode = registerUserResponse.getReturnCode();
        switch(returnCode){
            case ApiConstants.RESPONSE_OK:

                Log.d("test", "registration successful");
                Bundle bundle =  new Bundle();
                //TODO: More meaninful message perhaps phone number.."
                bundle.putString(FirebaseAnalytics.Param.CONTENT,"User Registration Sucessful" );
                mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SIGN_UP,bundle);
                Intent userDashboardActivity = new Intent(SignInOptionsActivity.this, SignInActivity.class);
                startActivity(userDashboardActivity);
                finish();
                break;
            case ApiConstants.RESPONSE_UNEXPECTED:
                String message= "Sorry. Unexpected Api Response. Please try again later";
                String error= " Error 404. Unable to register.";
                Intent errorLoginActivity = new Intent(SignInOptionsActivity.this, ErrorActivity.class);
                errorLoginActivity.putExtra("message", message);
                errorLoginActivity.putExtra("error", error);
                errorLoginActivity.putExtra("tryAgain", false);
                finish();
                startActivity(errorLoginActivity);
                FirebaseCrash.report(new Exception ("User Attempted Registration but webservice failed. Check backend."));
            default:
                break;
        }
    }
};
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sign_in_options);
    ButterKnife.bind(this);
    injectDependencies();
    registerObservers();
    mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
    phoneNumber = getIntent().getStringExtra("phoneNum");
    latitude = getIntent().getDoubleExtra("latitude", 0);
    longitude = getIntent().getDoubleExtra("longitude", 0);
    registerGoogle();
}
private void registerGoogle(){
    //For google sign-in
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build();
    mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
    mAuth= FirebaseAuth.getInstance();
    SignInButton googleSignIn= findViewById(R.id.google_sign_in_button);
    googleSignIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            signIn();
        }
    });

}



private void signIn() {
    Intent signInIntent = mGoogleSignInClient.getSignInIntent();
    startActivityForResult(signInIntent, RC_SIGN_IN);
}
private void updateUI(FirebaseUser user) {
    if (user != null) {
        Log.d(LogTags.LOG_IN, "Getting info");
        String totalName=user.getDisplayName();
        int i=0;
        boolean exitLoop=false;

        for(i=0;i<totalName.length()&&!exitLoop;i++){
            if(totalName.charAt(i)==' '){
                exitLoop=true;
            }
            else{
                firstName+=totalName.charAt(i);
            }
        }
        while(i<totalName.length()){
            lastName+=totalName.charAt(i);
            i++;
        }
        Log.d(LogTags.LOG_IN, "Last Name: "+ lastName);
        email=user.getEmail();
        if(email==null|| email== " "){
            Log.d(LogTags.LOG_IN, "No email found");
        }
    }
    else {
        Log.d(LogTags.LOG_IN, "Null user found. ");
    }
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    callbackManager.onActivityResult(requestCode, resultCode, data);
    super.onActivityResult(requestCode, resultCode, data);
    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
    if (requestCode == RC_SIGN_IN) {
        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
        handleSignIn(task);

    }
}

private void handleSignIn(Task<GoogleSignInAccount> task) {
    try {
        // Google Sign In was successful, authenticate with Firebase
        GoogleSignInAccount account = task.getResult(ApiException.class);
        firebaseAuthWithGoogle(account);
          /*  firstNameEditText.setText(firstName);
            lastNameEditText.setText(lastName);
            emailEditText.setText(email);*/

        Toast.makeText(this,"Please fill the remaining information ", Toast.LENGTH_LONG).show();
        Intent register= new Intent(this, RegisterInfoActivity.class);
        Log.d(LogTags.LOG_IN, "Here is the information passed. "+"firstName: "+firstName+"lastName: "+lastName+"email :"+email+"phoneNumber : "+phoneNumber+longitude);

        register.putExtra("first_name", firstName);
        register.putExtra("last_name", lastName);
        register.putExtra("email", email);
        register.putExtra("phoneNum", phoneNumber);
        register.putExtra("latitude", latitude);
        register.putExtra("longitude", longitude);

        startActivity(register);

    } catch (ApiException e) {
        // Google Sign In failed, update UI appropriately
        Log.w(GTAG, "Google sign in failed", e);
        // ...
    }
}

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    Log.d(GTAG, "firebaseAuthWithGoogle:" + acct.getId());
    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, task -> {
                if (task.isSuccessful()) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(GTAG, "signInWithCredential:success");
                    user = mAuth.getCurrentUser();
                    updateUI(user);
                   // Toast.makeText(RegisterInfoActivity.this,Gname+email+Gphone, Toast.LENGTH_LONG).show();
                } else {
                    // If sign in fails, display a message to the user.
                 //   Toast.makeText(RegisterInfoActivity.this, "Log In Failed",Toast.LENGTH_LONG).show();
                    Log.w(GTAG, "signInWithCredential:failure", task.getException());
                }
            });
}
public void registerInfo(View view) {
    Intent register= new Intent(this, RegisterInfoActivity.class);
    register.putExtra("phoneNum", phoneNumber);
    register.putExtra("latitude", latitude);
    register.putExtra("longitude", longitude);
    startActivity(register);
}
}

1 个答案:

答案 0 :(得分:0)

这是解决方案的人。塞尔文,我没有要求你解释我的代码,它就在那里,所以你知道我在说什么。但无论如何,问题是我没有将更新UI放入firebaseAuthWithGoogle方法。这实际上是被调用的最后一个方法,因此当我在onActivity结果中调用我的意图时,首先调用它,然后调用firebaseAuthWithGoogle方法。由于我之前已经切换了视图,因此信息不会更新,第二次运行时我的代码可以访问前一个firebase用户。我希望这些信息可以帮助你们:)

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    Log.d(GTAG, "firebaseAuthWithGoogle:" + acct.getId());
    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, task -> {
                if (task.isSuccessful()) {
                    // Sign in success, update UI with the signed-in user's information
                    Log.d(GTAG, "signInWithCredential:success");
                    user = mAuth.getCurrentUser();
                    updateUI(user);
                    Toast.makeText(this,"Please fill the remaining information ", Toast.LENGTH_LONG).show();
                    Intent register= new Intent(this, RegisterInfoActivity.class);
                    Log.d(LogTags.LOG_IN, "Here is the information passed. "+"firstName: "+firstName+"lastName: "+lastName+"email :"+email+"phoneNumber : "+phoneNumber+longitude);

                    register.putExtra("first_name", firstName);
                    register.putExtra("last_name", lastName);
                    register.putExtra("email", email);
                    register.putExtra("phoneNum", phoneNumber);
                    register.putExtra("latitude", latitude);
                    register.putExtra("longitude", longitude);

                    startActivity(register);

                   // Toast.makeText(RegisterInfoActivity.this,Gname+email+Gphone, Toast.LENGTH_LONG).show();
                } else {
                    // If sign in fails, display a message to the user.
                 //   Toast.makeText(RegisterInfoActivity.this, "Log In Failed",Toast.LENGTH_LONG).show();
                    Log.w(GTAG, "signInWithCredential:failure", task.getException());
                }
            });
}