2019-03-18 Android 第三方登录集-FaceBook 登录集成

FaceBook 登录集成

  1. In your project, open your_app > Gradle Scripts > build.gradle (Project) make sure the following repository is listed in the buildscript { repositories {}}:
jcenter()

2.In your project, open your_app > Gradle Scripts > build.gradle (Module: app) and add the following implementation statement to the dependencies{} section to depend on the latest version of the Facebook Login SDK:

 implementation 'com.facebook.android:facebook-login:[4,5)'

3.Open your /app/res/values/strings.xml file.
Add the following:

Your App Id
Your App Scheme
ps: 此处值在创建应用后会自动生成 直接从文档复制即可
  1. Open the /app/manifest/AndroidManifest.xml file.
    Add the following uses-permission element after the application element:
  

5.Add the following meta-data element, an activity for Facebook, and an activity and intent filter for Chrome Custom Tabs inside your application element:


    
    
    
        
            
            
            
            
        
    

  1. Associate Your Package Name and Default Class with Your App


    WechatIMG14.jpeg
  2. Provide the Development and Release Key Hashes for Your App

Mac :Terminal -输入

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64

Windows:Terminal -输入

keytool -exportcert -alias androiddebugkey -keystore "C:\Users\USERNAME\.android\debug.keystore" | "PATH_TO_OPENSSL_LIBRARY\bin\openssl" sha1 -binary | "PATH_TO_OPENSSL_LIBRARY\bin\openssl" base64
WechatIMG15.jpeg

代码

FaceBook 文档代码

1.Add the Facebook Login Button

 

2.Register a Callback

callbackManager = CallbackManager.Factory.create();

If you are adding the button to a Fragment you must also update your activity to use your fragment. You can customize the properties of Login button and register a callback in your onCreate() or onCreateView() method. Properties you can customize includes LoginBehavior, DefaultAudience, ToolTipPopup.Style and permissions on the LoginButton. For example:


     
   private static final String EMAIL = "email";
     
   loginButton = (LoginButton) findViewById(R.id.login_button);
   loginButton.setReadPermissions(Arrays.asList(EMAIL));
   // If you are using in a fragment, call loginButton.setFragment(this);    

   // Callback registration
   loginButton.registerCallback(callbackManager, new FacebookCallback() {
       @Override
       public void onSuccess(LoginResult loginResult) {
           // App code
       }

       @Override
       public void onCancel() {
           // App code
       }

       @Override
       public void onError(FacebookException exception) {
           // App code
       }
   });

To respond to a login result, you need to register a callback with either LoginManager or LoginButton. If you register the callback with LoginButton, don't need to register the callback on Login manager.
You add the LoginManager callback to your activity or fragment's onCreate() method:


  callbackManager = CallbackManager.Factory.create();

  LoginManager.getInstance().registerCallback(callbackManager,
          new FacebookCallback() {
              @Override
              public void onSuccess(LoginResult loginResult) {
                  // App code
              }

              @Override
              public void onCancel() {
                   // App code
              }

              @Override
              public void onError(FacebookException exception) {
                   // App code   
              }
  });

      @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        callbackManager.onActivityResult(requestCode, resultCode, data);
        super.onActivityResult(requestCode, resultCode, data);
    }

Check Login Status

Your app can only have one person at a time logged in, and LoginManager sets the current AccessToken and Profile for that person. The FacebookSDK saves this data in shared preferences and sets at the beginning of the session. You can see if a person is already logged in by checking AccessToken.getCurrentAccessToken() and Profile.getCurrentProfile().
You can load AccessToken.getCurrentAccessToken with the SDK from cache or from an app book mark when your app launches from a cold start. You should check its validity in your Activity's onCreate method:

AccessToken accessToken = AccessToken.getCurrentAccessToken();
boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
  

Then you can later perform the actual login, such as in a custom button's OnClickListener:

LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile"));

封装整理 JAVA

/**
 * @author BuMingYang
 * @des FaceBook 登录
 */
public class FaceBookLogin {

    private Activity activity;
    private CallbackManager callbackManager;
    private FacebookListener facebookListener;
    private List permissions;
    private LoginManager loginManager;

    public FaceBookLogin(Activity activity) {
        this.activity = activity;

        //初始化facebook登录服务
        callbackManager = CallbackManager.Factory.create();
        getLoginManager().registerCallback(callbackManager, new FacebookCallback() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                // login success
                AccessToken accessToken = loginResult.getAccessToken();
                getLoginInfo(accessToken);
            }

            @Override
            public void onCancel() {
                //取消登录
                if (facebookListener != null) {
                    facebookListener.facebookLoginCancel();
                }
            }

            @Override
            public void onError(FacebookException error) {
                //登录出错
                if (facebookListener != null) {
                    facebookListener.facebookLoginFail(error.getMessage());
                }
            }
        });

        permissions = Arrays
                .asList("email", "user_likes", "user_status", "user_photos", "user_birthday", "public_profile", "user_friends");
    }

    /**
     * 登录
     */
    public void login() {

        getLoginManager().logInWithReadPermissions(
                activity, permissions);
    }

    /**
     * 退出
     */
    public void logout() {
        String logout = activity.getResources().getString(
                com.facebook.R.string.com_facebook_loginview_log_out_action);
        String cancel = activity.getResources().getString(
                com.facebook.R.string.com_facebook_loginview_cancel_action);
        String message;
        Profile profile = Profile.getCurrentProfile();
        if (profile != null && profile.getName() != null) {
            message = String.format(
                    activity.getResources().getString(
                            com.facebook.R.string.com_facebook_loginview_logged_in_as),
                    profile.getName());
        } else {
            message = activity.getResources().getString(
                    com.facebook.R.string.com_facebook_loginview_logged_in_using_facebook);
        }
        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
        builder.setMessage(message)
                .setCancelable(true)
                .setPositiveButton(logout, (dialog, which) -> getLoginManager().logOut())
                .setNegativeButton(cancel, null);
        builder.create().show();
    }

    /**
     * 获取登录信息
     *
     * @param accessToken
     */
    public void getLoginInfo(AccessToken accessToken) {

        GraphRequest request = GraphRequest.newMeRequest(accessToken, (object, response) -> {
            if (object != null) {
                //比如:1565455221565
                String id = object.optString("id");
                //比如:Zhang San
                String name = object.optString("name");
                //性别:比如 male (男)  female (女)
                String gender = object.optString("gender");
                //邮箱:比如:[email protected]
                String emali = object.optString("email");

                //获取用户头像
                JSONObject object_pic = object.optJSONObject("picture");
                JSONObject object_data = object_pic.optJSONObject("data");
                String photo = object_data.optString("url");

                //获取地域信息
                //zh_CN 代表中文简体
                String locale = object.optString("locale");

                Toast.makeText(activity, "" + object.toString(), Toast.LENGTH_SHORT).show();

                if (facebookListener != null) {
                     // 此处参数根需要自己修改
                    facebookListener.facebookLoginSuccess(object);
                }
            }
        });

        Bundle parameters = new Bundle();
        parameters.putString("fields", "id,name,link,gender,birthday,email,picture,locale,updated_time,timezone,age_range,first_name,last_name");
        request.setParameters(parameters);
        request.executeAsync();

    }

    /**
     * 获取loginMananger
     *
     * @return
     */
    private LoginManager getLoginManager() {
        if (loginManager == null) {
            loginManager = LoginManager.getInstance();
        }
        return loginManager;
    }

    public CallbackManager getCallbackManager() {
        return callbackManager;
    }

    /**
     * 设置登录简体器
     *
     * @param facebookListener
     */
    public void setFacebookListener(FacebookListener facebookListener) {

        this.facebookListener = facebookListener;
    }

    public interface FacebookListener {

        /**
         * 登录成功
         *
         * @param object 用户信息 JSONObject
         */
        void facebookLoginSuccess(JSONObject object);

        /**
         * 登录失败
         *
         * @param message 失败信息
         */
        void facebookLoginFail(String message);

        /**
         * 取消登录
         */
        void facebookLoginCancel();
    }


}

使用参考

private FaceBookLogin faceBookLogin = null;

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      
      faceBookLogin = new FaceBookLogin(this);

      faceBookLogin.setFacebookListener(new FaceBookLogin.FacebookListener() {
          @Override
          public void facebookLoginSuccess(JSONObject object) {

              mLoginResult.setText("facebook_account_oauth_Success !");

          }

          @Override
          public void facebookLoginFail(String message) {

              mLoginResult.setText("facebook_account_oauth_Fail !" + message);

          }

          @Override
          public void facebookLoginCancel() {

              mLoginResult.setText("facebook_account_oauth_Cancel !");

          }
      });

  }


@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        faceBookLogin.getCallbackManager().onActivityResult(requestCode, resultCode, data);
        super.onActivityResult(requestCode, resultCode, data);
    }

    @OnClick(R.id.login_button)
    public void onViewClicked() {

        faceBookLogin.login();

    }

Kotlin

/**
 * @author BuMingYang
 * @des FaceBook 登录
 */
class FaceBookLogin(private val activity: Activity) {

    private var callbackManager: CallbackManager? = null
    private var facebookListener: FacebookListener? = null
    private val permissions: List
    private var loginManager: LoginManager? = null

    init {
        //初始化facebook登录服务
        callbackManager = CallbackManager.Factory.create()
        getLoginManager()?.registerCallback(callbackManager, object : FacebookCallback {
            override fun onSuccess(loginResult: LoginResult) {
                // login success
                val accessToken = loginResult.accessToken
                getLoginInfo(accessToken)
            }

            override fun onCancel() {
                //取消登录
                if (facebookListener != null) {
                    facebookListener!!.facebookLoginCancel()
                }
            }

            override fun onError(error: FacebookException) {
                //登录出错
                if (facebookListener != null) {
                    facebookListener!!.facebookLoginFail(error.message)
                }
            }
        })

        permissions = Arrays
                .asList("email", "user_likes", "user_status", "user_photos", "user_birthday", "public_profile", "user_friends")
    }

    /**
     * 登录
     */
    fun login() {

        getLoginManager()?.logInWithReadPermissions(
                activity, permissions)
    }

    /**
     * 退出
     */
    fun logout() {
        val logout = activity.resources.getString(
                com.facebook.R.string.com_facebook_loginview_log_out_action)
        val cancel = activity.resources.getString(
                com.facebook.R.string.com_facebook_loginview_cancel_action)
        val message: String
        val profile = Profile.getCurrentProfile()
        if (profile != null && profile.name != null) {
            message = String.format(
                    activity.resources.getString(
                            com.facebook.R.string.com_facebook_loginview_logged_in_as),
                    profile.name)
        } else {
            message = activity.resources.getString(
                    com.facebook.R.string.com_facebook_loginview_logged_in_using_facebook)
        }
        val builder = AlertDialog.Builder(activity)
        builder.setMessage(message)
                .setCancelable(true)
                .setPositiveButton(logout) { dialog, which -> getLoginManager()?.logOut() }
                .setNegativeButton(cancel, null)
        builder.create().show()
    }

    /**
     * 获取登录信息
     *
     * @param accessToken
     */
    fun getLoginInfo(accessToken: AccessToken) {

        val request = GraphRequest.newMeRequest(accessToken) { `object`, response ->
            if (`object` != null) {
                //比如:1565455221565
                val id = `object`.optString("id")
                //比如:Zhang San
                val name = `object`.optString("name")
                //性别:比如 male (男)  female (女)
                val gender = `object`.optString("gender")
                //邮箱:比如:[email protected]
                val emali = `object`.optString("email")

                //获取用户头像
                val object_pic = `object`.optJSONObject("picture")
                val object_data = object_pic.optJSONObject("data")
                val photo = object_data.optString("url")

                //获取地域信息
                //zh_CN 代表中文简体
                val locale = `object`.optString("locale")

                Toast.makeText(activity, "" + `object`.toString(), Toast.LENGTH_SHORT).show()

                if (facebookListener != null) {
                    facebookListener!!.facebookLoginSuccess(`object`)
                }
            }
        }

        val parameters = Bundle()
        parameters.putString("fields", "id,name,link,gender,birthday,email,picture,locale,updated_time,timezone,age_range,first_name,last_name")
        request.parameters = parameters
        request.executeAsync()

    }

    /**
     * 获取loginMananger
     *
     * @return
     */
    private fun getLoginManager(): LoginManager? {
        if (loginManager == null) {
            loginManager = LoginManager.getInstance()
        }
        return loginManager
    }

    fun getCallbackManager(): CallbackManager? {

        return callbackManager
    }

    /**
     * 设置登录简体器
     *
     * @param facebookListener
     */
    fun setFacebookListener(facebookListener: FacebookListener) {

        this.facebookListener = facebookListener
    }

    interface FacebookListener {

        /**
         * 登录成功
         *
         * @param object 用户信息 JSONObject
         */
        fun facebookLoginSuccess(`object`: JSONObject?)

        /**
         * 登录失败
         * @param message 失败信息
         */
        fun facebookLoginFail(message: String?)

        /*** 取消登录 */
        fun facebookLoginCancel()
    }


}

详细见DEMO 写的不好 多担待!

你可能感兴趣的:(2019-03-18 Android 第三方登录集-FaceBook 登录集成)