Привет, я новичок в разработке Android. В настоящее время я пытаюсь создать базовое андроидное приложение с Firebase от Google в качестве его бэкэнд-системы.Магазин Facebook пользователя в Firebase
У меня есть кнопка «Войти с Facebook», всякий раз, когда эта кнопка нажата, открывается диалоговое окно, в котором пользователь вводит свои учетные данные на facebook, чтобы получить доступ к приложению. Когда это будет сделано, я хочу сохранить его адрес электронной почты, имя и идентификатор в Firebase, если он впервые зашел в систему, если он не первый раз заходит в систему, я хочу обновить его информацию.
Я создал класс User (POJO), который я буду использовать для представления этих данных. Моя проблема в том, что я, похоже, не знаю, где разместить код, который хранит эту информацию. Вот мой MainActivity класс:
public class MainActivity extends AppCompatActivity {
//Declare our view variables
private LoginButton mLoginButton;
private CallbackManager mCallbackManager;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private FirebaseDatabase mDatabase;
private DatabaseReference mDatabaseReference;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
setContentView(R.layout.activity_main);
//Initialize callback manager
mCallbackManager = CallbackManager.Factory.create();
//Assign the views to the corresponding variables
mLoginButton = (LoginButton) findViewById(R.id.login_button);
//Assign the button permissions
mLoginButton.setReadPermissions("email", "public_profile");
//Create instance of database
mDatabase = FirebaseDatabase.getInstance();
mDatabaseReference = mDatabase.getReference();
//Assign the button a task
mLoginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.d(TAG, "facebook:onSuccess:" + loginResult);
handleFacebookAccessToken(loginResult.getAccessToken());
}
@Override
public void onCancel() {
Log.d(TAG, "facebook:onCancel");
}
@Override
public void onError(FacebookException error) {
Log.d(TAG, "facebook:onError", error);
}
});
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
//Get currently logged in user
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
// Name, email address
String name = user.getDisplayName();
String email = user.getEmail();
// The user's ID, unique to the Firebase project. Do NOT use this value to
// authenticate with your backend server, if you have one. Use
// FirebaseUser.getToken() instead.
String uid = user.getUid();
//Create user
final User loggedIn = new User(uid, name, email);
mDatabaseReference.child("users").child(loggedIn.getId()).setValue(loggedIn);
mDatabaseReference.child("users").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// This method is called once with the initial value and again
// whenever data at this location is updated.
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
Log.w(TAG, "Failed to read value.", error.toException());
}
});
} else {
// User is signed out
Log.d(TAG, "onAuthStateChanged:signed_out");
}
}
};
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Pass the activity result back to the Facebook SDK
mCallbackManager.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onStart() {
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop() {
super.onStop();
if (mAuthListener != null) {
mAuth.removeAuthStateListener(mAuthListener);
}
}
//If user successfully signs in the LoginButton's onSuccess callback method
// get an access token for the signed-in user, exchange it for a Firebase credential
// and authenticate with Firebase using the Firebase credential
private void handleFacebookAccessToken(AccessToken token) {
Log.d(TAG, "handleFacebookAccessToken:" + token);
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());
// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
if (!task.isSuccessful()) {
Log.w(TAG, "signInWithCredential", task.getException());
Toast.makeText(MainActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show();
}
}
});
}
}
Вот мой класс User:
public class User {
private String id;
private String name;
private String email;
public User(){
}
public User(String id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Спасибо за ваше время
Похоже, вы уже поместили код в свой прослушиватель AuthStateChanged. Разве это не работает для вас? –
@ RosárioPereiraFernandes нет, это не – hallaksec