Issue
in login page, I use these 2 codes below:
facebookLoginButton.setOnClickListener {
facebookLoginManager.logInWithReadPermissions(this, Arrays.asList("email", "public_profile"))
}
private fun setUpFacebookLogin() {
facebookLoginManager.registerCallback(callbackManager, object : FacebookCallback<LoginResult> {
override fun onSuccess(loginResult: LoginResult) {
Log.d(TAG, "facebook:onSuccess:$loginResult")
handleFacebookAccessToken(loginResult.accessToken)
}
override fun onCancel() {
Log.d(TAG, "facebook:onCancel")
progressBar.visibility = View.GONE
}
override fun onError(error: FacebookException) {
Log.d(TAG, "facebook:onError", error)
progressBar.visibility = View.GONE
mActivity.longToast("Gagal masuk dengan akun Facebook, silahkan periksa koneksi internet Anda, atau gunakan akun Google atau email yang lain.")
}
})
}
private fun handleFacebookAccessToken(token: AccessToken) {
Log.d(TAG, "handleFacebookAccessToken:$token")
val credential = FacebookAuthProvider.getCredential(token.token)
auth.signInWithCredential(credential).addOnSuccessListener {
Log.d(TAG, "facebook signInWithCredential:success")
val user = auth.currentUser ?: return@addOnSuccessListener
checkUserBasicDataInFirestore(user)
}.addOnFailureListener {exception ->
progressBar.visibility = View.GONE
Log.d(TAG, "facebook signInWithCredential failed: ${exception.localizedMessage}")
mActivity.longToast(exception.localizedMessage)
}
}
I actually can register the user to firebase auth by using those code, but I have problem when trying to login using facebook. auth.signInWithCredential(credential).addOnSuccessListener
is triggered actually, so I assume I can success login using facebook in login page
but in the other screen (fragment), when I want to access the current user to get the uid, it always null, like this
val userFirebaseAuth = FirebaseAuth.getInstance().currentUser
I don't understand why userFirebaseAuth
is always null ?
Solution
From my experience, the current user isn't always immediately available at the app launches from a cold start. It can take a moment for Firebase Authentication to initialize and refresh the user's ID token if necessary. Since you don't know how long that will take, you should use a listener to determine the first possible moment when the current user is absolutely known and verified by the SDK. It's a good idea to read about: How does the firebase AuthStateListener work?
Create a new AuthStateListener:
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// Sign in logic here.
}
}
};
Then add and remove it as needed:
FirebaseAuth.getInstance().addAuthStateListener(mAuthListener);
FirebaseAuth.getInstance().removeAuthStateListener(mAuthListener);
Also check out the API documentation on AuthStateListener.
Answered By - Doug Stevenson Answer Checked By - Willingham (PHPFixing Volunteer)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.