当前位置: 代码迷 >> Android >> 将Facebook用户存储在Firebase中
  详细解决方案

将Facebook用户存储在Firebase中

热度:12   发布时间:2023-08-04 11:19:23.0

您好,我是Android开发的新手。 我目前正在尝试使用Google的Firebase作为其后端系统来构建基本的android应用程序。

我有一个“使用Facebook登录”按钮,只要单击此按钮,它就会打开一个对话框,用户可以在其中输入他的Facebook凭据来访问该应用程序。 完成后,如果这是他第一次登录,那么我想在Firebase中存储他的电子邮件,姓名和ID;如果不是第一次登录,我想更新他的信息。

我创建了一个名为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;
    }

}

感谢您的时间

您已经完成了最多的工作,所以我将创建两种方法供您使用。

protected void getUserInfo(final LoginResult login_result){

    GraphRequest data_request = GraphRequest.newMeRequest(
            login_result.getAccessToken(),
            new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(
                        JSONObject object,
                        GraphResponse response) {
                    try {
                        String facebook_id = object.getString("id");
                        String f_name = object.getString("name");
                        String email_id = object.getString("email");
                        String token = login_result.getAccessToken().getToken();
                        String picUrl = "https://graph.facebook.com/me/picture?type=normal&method=GET&access_token="+ token;

saveFacebookCredentialsInFirebase(login_result.getAccessToken());

                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                    }
                }
            });
    Bundle permission_param = new Bundle();
    permission_param.putString("fields", "id,name,email,picture.width(120).height(120)");
    data_request.setParameters(permission_param);
    data_request.executeAsync();
    data_request.executeAsync();
}

在此处将数据保存在Firebase中

private void saveFacebookCredentialsInFirebase(AccessToken accessToken){
  AuthCredential credential = FacebookAuthProvider.getCredential(accessToken.getToken());
    firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if(!task.isSuccessful()){
                Toast.makeText(getApplicationContext(),"Error logging in", Toast.LENGTH_LONG).show();
            }else{
               Toast.makeText(getApplicationContext(),"Login in Successful", Toast.LENGTH_LONG).show();  
            }
        }
    });    
}

我将firebase降级到9.6.0,以避免Google Play服务错误,并且在用户使用handleFacebookAccessToken方法中的凭据登录后保存了该用户。

  相关解决方案