也许有人还在寻找解决方案:
在活动中(yourLoginActivity.class)
*创建一个常量int来表示ActivityForResult的requestCode
// You can change to any Value just be unique
private static final int RC_SIGN_IN = 1001;
–> 声明 GoogleApiClient、FirebaseAuth、AuthStateListener 和 CallbackManager
private static final String TAG = "LoginActivity";
private static final int RC_SIGN_IN = 1001;
private GoogleApiClient mGoogleApiClient;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private CallbackManager mCallbackManager;
–> 初始化上面声明的变量:
mCallbackManager = CallbackManager.Factory.create(); mAuth = FirebaseAuth.getInstance(); mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
} else {
// User is signed out
Log.d(TAG, "onAuthStateChanged:signed_out");
}
} };
–> 获取 SingInButton 和 LoginButton 的引用:
LoginButton facebookLoginButton = findViewById(R.id.login_facebook_button);
SignInButton mGoogleSignInButton = findViewById(R.id.sign_in_button);
–> 处理 SingInButton 和 LoginButton:
facebookLoginButton.setReadPermissions("email", "public_profile", "user_birthday");
facebookLoginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
firebaseAuthWithFacebook(loginResult.getAccessToken());
}
@Override
public void onCancel() {
Toast.makeText(LoginActivity.this, "Succes", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(FacebookException error) {
Toast.makeText(LoginActivity.this, "Succes", Toast.LENGTH_SHORT).show();
}
});
mGoogleSignInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
signIn();
}
});
–> 管理 GoogleSingInOptions 和 GoogleApiClient
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 /* FragmentActivity */, this /* OnConnectionFailedListener */)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
–> 处理 Facebook 登录
private void authWithFacebook(AccessToken token) {
Log.d(TAG, "handleFacebookAccessToken:" + token);
final AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
if (mAuth.getCurrentUser() != null) {
mAuth.getCurrentUser().linkWithCredential(credential)
.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
Toast.makeText(LoginActivity.this, "Logged IN", Toast.LENGTH_LONG).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
e.printStackTrace();
Log.e(TAG, "onFailure: " + e.getMessage());
mAuth.signInWithCredential(credential).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
Toast.makeText(LoginActivity.this, "Logged IN", Toast.LENGTH_LONG).show();
}
});
}
});
} else {
mAuth.signInWithCredential(credential);
}
}
–> 处理 Google 登录:
pprivate void authWithGoogle(final GoogleSignInAccount acct) {
Log.d(TAG, "firebaseAuthWithGooogle:" + acct.getId());
final AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
if (mAuth.getCurrentUser() != null) {
mAuth.getCurrentUser().linkWithCredential(credential).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
Toast.makeText(LoginActivity.this, "Logged IN", Toast.LENGTH_LONG).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
e.printStackTrace();
Log.e(TAG, "onFailure: " + e.getMessage());
mAuth.signInWithCredential(credential).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
Toast.makeText(LoginActivity.this, "Logged IN", Toast.LENGTH_LONG).show();
}
});
}
});
}else{
mAuth.signInWithCredential(credential);
}
}
–> 覆盖 onConnectionFailed():
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
// An unresolvable error has occurred and Google APIs (including Sign-In) will not
// be available.
Log.d(TAG, "onConnectionFailed:" + connectionResult);
Toast.makeText(this, "Google Play Services error.", Toast.LENGTH_SHORT).show();
}
–> 唱歌并调用onActivityForResult()
private void signIn() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
–> 实现 GoogleApiClient.OnConnectionFailedListener
LoginActivity extends AppCompatActivity implements GoogleApiClient.OnConnectionFailedListener{
....
}
确保您已启用了 FACEBOOK SDK 从 FIREBASE 控制台登录并正确设置!