我已经实施了谷歌+登录到我的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);
}
}
答案 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());
}
});
}