[Ứng dụng MyStore] Bài 5: Xây dựng chức năng đăng nhập bằng facebook

Tiếp tục loạt bài viết hướng dẫn xây dựng ứng dụng MyStore sử dụng firebase. Trong bài viết hôm nay mình sẽ hướng dẫn các bạn code chức năng đăng nhập bằng facebook.

1.THIẾT LẬP

Ở các bài viết trước chúng ta đã tích hợp sẵn các thư viên, trong bài viết hôm nay chúng ta chỉ thêm sdk của facebook vào.
– /app/build.gradle

ở đây mình sử dụng  phiên bản 4.5.

compile 'com.facebook.android:facebook-android-sdk:[4,5)'

Bây giờ các bạn bắt đầu Setup Login Facebook theo hướng dẫn trên trang này:
https://developers.facebook.com/quickstarts/794319497386182/?platform=android
Cách để lấy HashKey.

Sau khi setup xong các bạn truy cập vào facebook lấy thông tin và vào firebase điền các thông tin như sau:

Mở FireBase điền vào:

Sau đó vào điền thêm Uri vào facebook:

Kết thúc quá trình Setup:

2. XỬ LÝ FACEBOOK LOGIN

-Đầu tiên mình tạo một class: FacebookLogin.java 

+ Hàm 1:  Request Permissions facebook
+ Hàm 2:  Xử lý Kết quả request
+ Hàm 3: Lưu thông tin user lên database

public class FaceBookLogin extends BaseFireBase {
    private static String TAG = FaceBookLogin.class.getSimpleName();
    private DatabaseReference mDatabase;
    private Activity activity;

    public FaceBookLogin(Activity activity) {
        mDatabase = getDatabaseReference();
        this.activity = activity;
    }

    /**
     * Request Permissions facebook
     * @param callbackManager
     * @param activity
     * @param mAuth
     */
    public void loginFaceBook(CallbackManager callbackManager, final Activity activity, final FirebaseAuth mAuth) {
        FacebookSdk.addLoggingBehavior(LoggingBehavior.REQUESTS);
        LoginManager.getInstance().logInWithReadPermissions(activity, Arrays.asList("public_profile", "email"));
        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        handleFacebookAccessToken(mAuth,mDatabase,loginResult.getAccessToken(),activity);
                    }

                    @Override
                    public void onCancel() {
                        Toast.makeText(activity, "Login Cancel!", Toast.LENGTH_LONG).show();
                    }

                    @Override
                    public void onError(FacebookException exception) {
                        Toast.makeText(activity, "Login Error!", Toast.LENGTH_LONG).show();
                        Log.e(TAG,exception.toString());
                    }
                });
    }

    /**
     * Xử lý Đăng nhập
     * @param mAuth
     * @param mDatabase
     * @param token
     * @param activity
     */
    private  void handleFacebookAccessToken(FirebaseAuth mAuth, final DatabaseReference mDatabase, AccessToken token, final Activity activity) {
        AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(activity, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            Users users = new Users();
                            users.setUid(task.getResult().getUser().getUid());
                            users.setName(task.getResult().getUser().getDisplayName());
                            users.setEmail(task.getResult().getUser().getEmail());
                            //users.setAvatar(String.valueOf(task.getResult().getUser().getPhotoUrl()));
                            createUser(users);
                        }
                        if (!task.isSuccessful()) {
                            Toast.makeText(activity,activity.getString(R.string.facebook_login_failed), Toast.LENGTH_SHORT).show();
                            if (task.getException() instanceof FirebaseAuthUserCollisionException) {
                                Toast.makeText(activity,activity.getString(R.string.facebook_registed), Toast.LENGTH_SHORT).show();
                            }
                        }
                    }
                });

    }


    /**
     * Tạo một User Mới
     * @param user
     */
    private void createUser(final Users user) {
        mDatabase.child(Constants.USERS).child(user.getUid()).setValue(user).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Log.d(TAG, "onSuccess: users created ");
            }
        });
    }
}

Ngoài ra bạn có thể lấy Avatar bằng hàm : task.getResult().getUser().getPhotoUrl();

-Quay lại LoginActivity.java

Khái báo thêm:

 private FaceBookLogin faceBookLogin;
 private CallbackManager mCallbackManager;

Trong onCreate:

faceBookLogin = new FaceBookLogin(this);
mCallbackManager = CallbackManager.Factory.create();

Override  OnActivityResult

  @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        mCallbackManager.onActivityResult(requestCode, resultCode, data);
    }
  • Cuối cùng tại Button Facebook login gọi hàm:
  faceBookLogin.loginFaceBook(mCallbackManager, LoginActivity.this, mAuth);

——————————–
Lưu ý: Mình chỉ code các chức năng chính, các bạn cần tìm các trường hợp khác có thể xảy ra khi login và xử lý nó.

– Ví dụ: Khi Login Thành Công và Users đã được lưu trong database vậy chúng ta có cần lưu tiếp hay không :D.

Nguyễn Linh

Chia sẻ để cùng tiến bộ...