我正在使用Login Facebook开发应用程序,我需要在Firebase身份验证中注册用户。我该怎么办?
我尝试了很多事情,但没有成功;我可以使用Facebook登录,但是无法在Firebase控制台中注册用户,我也不知道为什么。甚至Firebase应用程序都检测到了用户,但未在Authentication类中注册该用户。
主要活动.java
public class MainActivity extends AppCompatActivity {
private LoginButton loginButton;
private CallbackManager callbackManager;
private FirebaseAuth firebaseAuth;
private FirebaseAuth.AuthStateListener firebaseAuthListener;
public static final String TAG = "TODAY";
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
callbackManager = CallbackManager.Factory.create();
firebaseAuth = FirebaseAuth.getInstance();
progressBar = (ProgressBar) findViewById(R.id.progressBar);
loginButton = (LoginButton) findViewById(R.id.loginbutton);
loginButton.setReadPermissions("email", "public_profile");
loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.d(TAG, "facebook:onSuccess:" + loginResult);
exchangeFacebookAccessToken (loginResult.getAccessToken());
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException error) {
}
});
firebaseAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
goMainScreen();
} else {
Log.d("TODAY", "NO LOGIN");
}
}
};
}
private void exchangeFacebookAccessToken(AccessToken accessToken) {
loginButton.setVisibility(View.GONE);
progressBar.setVisibility(View.VISIBLE);
AuthCredential credential = FacebookAuthProvider.getCredential(accessToken.getToken());
firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d("TODAY", "signInWithCredential:onComplete:" + task.isSuccessful());
if (!task.isSuccessful()) {
Log.d("TODAY", "fallo:" + task.isSuccessful());
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "signInWithEmail:failure", task.getException());
Toast.makeText(MainActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
progressBar.setVisibility(View.GONE);
loginButton.setVisibility(View.VISIBLE);
}
});
}
private void goMainScreen() {
Intent intent = new Intent(this, inicio_persona.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
@Override
protected void onStart() {
super.onStart();
FirebaseUser currentUser = firebaseAuth.getCurrentUser();
firebaseAuth.addAuthStateListener(firebaseAuthListener);
}
@Override
protected void onStop() {
super.onStop();
firebaseAuth.removeAuthStateListener(firebaseAuthListener);
}
}
inicio_persona.java
public class inicio_persona extends AppCompatActivity {
private ImageView photoImageView;
private TextView nameTextView;
private TextView emailTextView;
private TextView idTextView;
private ProfileTracker profileTracker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.persona_inicio);
photoImageView = (ImageView) findViewById(R.id.photoImageView);
nameTextView = (TextView) findViewById(R.id.nameTextView);
emailTextView = (TextView) findViewById(R.id.emailTextView);
idTextView = (TextView) findViewById(R.id.uidTextView);
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
profileTracker = new ProfileTracker() {
@Override
protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
if (currentProfile != null) {
displayProfileInfo(currentProfile);
}
}
};
if (AccessToken.getCurrentAccessToken() == null) {
goLoginScreen();
} else {
requestEmail(AccessToken.getCurrentAccessToken());
Profile profile = Profile.getCurrentProfile();
if (profile != null) {
displayProfileInfo(profile);
} else {
Profile.fetchProfileForCurrentAccessToken();
}
}
}
private void requestEmail(AccessToken currentAccessToken) {
GraphRequest request = GraphRequest.newMeRequest(currentAccessToken, new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
if (response.getError() != null) {
Toast.makeText(getApplicationContext(), response.getError().getErrorMessage(), Toast.LENGTH_LONG).show();
return;
}
try {
String email = object.getString("email");
setEmail(email);
} catch (JSONException e) {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id, first_name, last_name, email, gender, birthday, location");
request.setParameters(parameters);
request.executeAsync();
}
private void setEmail(String email) {
emailTextView.setText(email);
}
private void goLoginScreen() {
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
public void logout(View view) {
FirebaseAuth.getInstance().signOut();
LoginManager.getInstance().logOut();
goLoginScreen();
}
private void displayProfileInfo(Profile profile) {
String id = profile.getId();
String name = profile.getName();
String photoUrl = profile.getProfilePictureUri(100, 100).toString();
nameTextView.setText(name);
idTextView.setText(id);
Glide.with(getApplicationContext())
.load(photoUrl)
.into(photoImageView);
}
@Override
protected void onDestroy() {
super.onDestroy();
profileTracker.stopTracking();
}
}