こんにちは、私はAndroid開発の初心者です。私は現在、GoogleのFirebaseをバックエンドシステムとして、基本的なAndroidアプリケーションを構築しようとしています。FacebookベースのユーザーをFirebaseに保存
「Facebookでログイン」ボタンがあります。このボタンをクリックするたびに、アプリケーションにアクセスするためにユーザーがFacebookの資格情報を入力するダイアログが開きます。それが終わったら、最初にログインしたときに彼の電子メール、名前、およびIDをFirebaseに保存したいのですが、初めてログインするのでなければ彼の情報を更新したいと思います。
このデータを表すために使用するUser(POJO)というクラスを作成しました。私の問題は、私はこの情報を格納するコードをどこに置くべきかわからないということです。
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クラスです: はここに私のMainActivityクラスです
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