Android 應用程序集成FaceBook 登錄及二次封裝


1、首先在Facebook 開發者平台注冊一個賬號

        https://developers.facebook.com/

      開發者后台  https://developers.facebook.com/apps

2、創建賬號並且獲得 APP ID 

        圖一

        

       圖二

             

       圖三

      

      圖四

        

     圖五

      

 

 3、獲取app簽名的Key Hashes 值(兩種方式) 

       獲取方式:https://blog.csdn.net/zhaoyanjun6/article/details/105344657                                    

 4、設置應用的基本配置

         圖一

         

      圖二

        

      圖三

       

         

 5、App開始集成 FacebookSDk

        5.1 在項目的 build.gradle 添加

              compile 'com.facebook.android:facebook-android-sdk:4.10.1'

            查看最新的版本 : http://search.maven.org/#search%7Cga%7C1%7Ccom.facebook.android

       5.2 在應用的 Application 里面初始化SDK

            //facebook登錄初始化

      FacebookSdk.sdkInitialize( getApplicationContext() );

       5.3 在value文件夾下 strings.xml 中

              <!-- facebook 登錄 key-->

      <string name="facebook_app_id">1001702146573854</string>

       5.4 在 AndroidManifest.xml 中          

<meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id"/>

<activity
android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:label="@string/app_name"
>
</activity>  

     

       5.5 在布局文件中定義登錄按鈕

 <com.facebook.login.widget.LoginButton
            android:id="@+id/facebook_bt"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="facebook login"
            >
 </com.facebook.login.widget.LoginButton>

   

       5.6 在代碼中實現

 1 package com.pegasus.map.presentation.ui.activity;
 2 import android.content.Intent;
 3 import android.os.Bundle;
 4 import android.widget.Toast;
 5 import com.facebook.CallbackManager;
 6 import com.facebook.FacebookCallback;
 7 import com.facebook.FacebookException;
 8 import com.facebook.login.LoginResult;
 9 import com.facebook.login.widget.LoginButton;
10 import com.pegasus.map.R;
11 import com.pegasus.map.presentation.ui.base.BaseActivity;
12 import butterknife.Bind;
13 import butterknife.ButterKnife;
14 
15 
16 /**
17  * Created by ${zyj} on 2016/3/24.
18  * 登錄
19  */
20 
21 public class LoginLoginActivity extends BaseActivity {
22     
23     @Bind(R.id.facebook_bt)
24     public LoginButton facebook_bt;
25     
26     private CallbackManager callbackManager ;
27     
28     @Override
29     protected void onCreate(Bundle savedInstanceState) {
30         super.onCreate(savedInstanceState);
31         setContentView(R.layout.activity_login);
32 
33         ButterKnife.bind(this);
34         callbackManager = CallbackManager.Factory.create() ;
35         
36         init();
37     }
38 
39     private void init() {
40         
41         facebook_bt.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
42             @Override
43             public void onSuccess(LoginResult loginResult) {
44                 Toast.makeText(LoginLoginActivity.this, "facebook登錄成功了", Toast.LENGTH_SHORT).show();
45                 log("facebook登錄成功了" + loginResult.getAccessToken());
//獲取登錄信息
getLoginInfo( loginResult.getAccessToken() ) ;
46 } 47 48 @Override 49 public void onCancel() { 50 Toast.makeText(LoginLoginActivity.this, "facebook登錄取消了", Toast.LENGTH_SHORT).show(); 51 log("facebook登錄取消了"); 52 } 53 54 @Override 55 public void onError(FacebookException error) { 56 Toast.makeText(LoginLoginActivity.this, "facebook登錄失敗了", Toast.LENGTH_SHORT).show(); 57 log("facebook登錄失敗了"); 58 } 59 }); 60 61 } 62 63 @Override 64 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 65 super.onActivityResult(requestCode, resultCode, data); 66 67 //facebook回調 68 callbackManager.onActivityResult( requestCode , resultCode ,data ) ; 69 } 70 }

 

 1 /**
 2      * 獲取登錄信息
 3      * @param accessToken
 4      */
 5     public void getLoginInfo( AccessToken accessToken ){
 6         GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
 7             @Override
 8             public void onCompleted(JSONObject object, GraphResponse response) {
 9                 if (object != null) {
10                     String id = object.optString( "id" ) ;   //比如:1565455221565
11                     String name = object.optString( "name" ) ;  //比如:Zhang San
12                     String gender = object.optString("gender") ;  //性別:比如 male (男)  female (女)
13                     String emali = object.optString("email") ;  //郵箱:比如:56236545@qq.com
14 
15                     //獲取用戶頭像
16                     JSONObject object_pic = object.optJSONObject( "picture" ) ;
17                     JSONObject object_data = object_pic.optJSONObject( "data" ) ;
18                     String photo = object_data.optString( "url" )  ;
19 
20                     //獲取地域信息
21                     String locale = object.optString( "locale" ) ;   //zh_CN 代表中文簡體
22 
23                     Toast.makeText( activity , "" + object.toString() , Toast.LENGTH_SHORT).show();
24                 }
25             }
26         }) ;
27 
28         Bundle parameters = new Bundle();
29         parameters.putString("fields", "id,name,link,gender,birthday,email,picture,locale,updated_time,timezone,age_range,first_name,last_name");
30         request.setParameters(parameters);
31         request.executeAsync() ;
32     }

 

        5.7 企業賬號需要注意的事項,把發布按鈕打開

         

                      

6、對facebookSDk 進行二次封裝        

  1 package com.pegasus.map.presentation.utils;
  2 
  3 import android.app.Activity;
  4 import android.content.DialogInterface;
  5 import android.os.Bundle;
  6 import android.support.v7.app.AlertDialog;
  7 import android.widget.Toast;
  8 
  9 import com.facebook.AccessToken;
 10 import com.facebook.CallbackManager;
 11 import com.facebook.FacebookCallback;
 12 import com.facebook.FacebookException;
 13 import com.facebook.GraphRequest;
 14 import com.facebook.GraphResponse;
 15 import com.facebook.Profile;
 16 import com.facebook.login.LoginManager;
 17 import com.facebook.login.LoginResult;
 18 
 19 import org.json.JSONObject;
 20 
 21 import java.util.Arrays;
 22 import java.util.Collections;
 23 import java.util.List;
 24 
 25 /**
 26  * Created by ${zyj} on 2016/3/30.
 27  */
 28 public class FaceBookLogin {
 29 
 30     private Activity activity ;
 31     private CallbackManager callbackManager ;
 32     private FacebookListener facebookListener ;
 33     private List<String> permissions = Collections.<String>emptyList();
 34     private LoginManager loginManager;
 35 
 36     public FaceBookLogin( Activity activity ){
 37         this.activity = activity ;
 38 
 39         //初始化facebook登錄服務
 40         callbackManager = CallbackManager.Factory.create() ;
 41         getLoginManager().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
 42             @Override
 43             public void onSuccess(LoginResult loginResult) {
 44                 // login success
 45                 AccessToken accessToken = loginResult.getAccessToken();
 46                 getLoginInfo(accessToken);
 47             }
 48 
 49             @Override
 50             public void onCancel() {
 51                 //取消登錄
 52             }
 53 
 54             @Override
 55             public void onError(FacebookException error) {
 56                 //登錄出錯
 57             }
 58         });
 59 
 60         permissions = Arrays
 61                 .asList("email", "user_likes", "user_status", "user_photos", "user_birthday", "public_profile", "user_friends") ;
 62     }
 63 
 64     /**
 65      * 登錄
 66      */
 67     public void login(){
 68         getLoginManager().logInWithReadPermissions(
 69                 activity, permissions);
 70     }
 71 
 72     /**
 73      * 退出
 74      */
 75     public void logout(){
 76         String logout = activity.getResources().getString(
 77                 com.facebook.R.string.com_facebook_loginview_log_out_action);
 78         String cancel = activity.getResources().getString(
 79                 com.facebook.R.string.com_facebook_loginview_cancel_action);
 80         String message;
 81         Profile profile = Profile.getCurrentProfile();
 82         if (profile != null && profile.getName() != null) {
 83             message = String.format(
 84                     activity.getResources().getString(
 85                             com.facebook.R.string.com_facebook_loginview_logged_in_as),
 86                     profile.getName());
 87         } else {
 88             message = activity.getResources().getString(
 89                     com.facebook.R.string.com_facebook_loginview_logged_in_using_facebook);
 90         }
 91         AlertDialog.Builder builder = new AlertDialog.Builder(activity);
 92         builder.setMessage(message)
 93                 .setCancelable(true)
 94                 .setPositiveButton(logout, new DialogInterface.OnClickListener() {
 95                     public void onClick(DialogInterface dialog, int which) {
 96                         getLoginManager().logOut();
 97                     }
 98                 })
 99                 .setNegativeButton(cancel, null);
100         builder.create().show();
101     }
102 
103     /**
104      * 獲取登錄信息
105      * @param accessToken
106      */
107     public void getLoginInfo( AccessToken accessToken ){
108         GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
109             @Override
110             public void onCompleted(JSONObject object, GraphResponse response) {
111                 if (object != null) {
112                     String id = object.optString("id");   //比如:1565455221565
113                     String name = object.optString("name");  //比如:Zhang San
114                     String gender = object.optString("gender");  //性別:比如 male (男)  female (女)
115                     String emali = object.optString("email");  //郵箱:比如:56236545@qq.com
116 
117                     //獲取用戶頭像
118                     JSONObject object_pic = object.optJSONObject("picture");
119                     JSONObject object_data = object_pic.optJSONObject("data");
120                     String photo = object_data.optString("url");
121 
122                     //獲取地域信息
123                     String locale = object.optString("locale");   //zh_CN 代表中文簡體
124 
125                     Toast.makeText(activity, "" + object.toString(), Toast.LENGTH_SHORT).show();
126                 }
127             }
128         }) ;
129 
130         Bundle parameters = new Bundle();
131         parameters.putString("fields", "id,name,link,gender,birthday,email,picture,locale,updated_time,timezone,age_range,first_name,last_name");
132         request.setParameters(parameters);
133         request.executeAsync() ;
134     }
135 
136     /**
137      * 獲取loginMananger
138      * @return
139      */
140     private LoginManager getLoginManager() {
141         if (loginManager == null) {
142             loginManager = LoginManager.getInstance();
143         }
144         return loginManager;
145     }
146 
147     public CallbackManager getCallbackManager(){
148         return callbackManager ;
149     }
150 
151     /**
152      * 設置登錄簡體器
153      * @param facebookListener
154      */
155     public void setFacebookListener( FacebookListener facebookListener ){
156         this.facebookListener =facebookListener ;
157     }
158 
159     public interface FacebookListener {
160         void facebookLoginSuccess();
161         void facebookLoginFail() ;
162     }
163 
164 
165 }

 在 activity 使用

1      //初始化Facebook登錄服務
2      FaceBookLogin  faceBookLogin = new FaceBookLogin( this ) ;
3         
4      //登錄
5      faceBookLogin.login();
6         
7      //退出
8      faceBookLogin.logout();

 

1 @Override
2     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
3         super.onActivityResult(requestCode, resultCode, data);
4 
5         //facebook回調
6         faceBookLogin.getCallbackManager().onActivityResult(requestCode, resultCode, data);
7 
8     }

 


 最新更新(2020/4/16)

最近有機會又接觸到海外項目,剛好要做 facebook 登陸功能,下面我把封裝的代碼用 Kotlin 實現一遍:

FacebookLoginUtil 工具類
package com.enjoy.literaturemodule.account.login.facebook

import android.app.Activity
import android.content.DialogInterface
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import com.facebook.*
import com.facebook.AccessToken
import com.facebook.login.LoginManager
import com.facebook.login.LoginResult
import org.json.JSONObject


/**
 * @author yanjun.zhao
 * @time 2020/3/10 2:35 PM
 * @desc
 */
class FacebookLoginUtil(private var activity: Activity) {

    private var loginManager: LoginManager? = null
    private val permissions: List<String>
    private var callbackManager: CallbackManager? = null

    init {
        //初始化facebook登錄服務
        callbackManager = CallbackManager.Factory.create()
        getLoginManager()?.registerCallback(callbackManager, object : FacebookCallback<LoginResult> {
            override fun onSuccess(result: LoginResult?) {
                getLoginInfo(result?.accessToken)
            }

            override fun onCancel() {
            }

            override fun onError(error: FacebookException?) {
            }
        })
        permissions = listOf("email", "user_likes", "user_status", "user_photos", "user_birthday", "public_profile", "user_friends");
    }


    /**
     * 登陸
     */
    fun login() {
        getLoginManager().logInWithReadPermissions(activity, permissions)
    }

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

    /**
     * 獲取登錄信息
     * @param accessToken
     */
    private fun getLoginInfo(accessToken: AccessToken?) {
        var request = GraphRequest.newMeRequest(accessToken, object : GraphRequest.GraphJSONObjectCallback {
            override fun onCompleted(`object`: JSONObject?, response: GraphResponse?) {

                `object`?.run {
                    val id = optString("id") //比如:1565455221565
                    val name = optString("name") //比如:Zhang San
                    val gender = optString("gender") //性別:比如 male (男)  female (女)
                    val emali = optString("email") //郵箱:比如:56236545@qq.com
                    //獲取用戶頭像
                    val object_pic = optJSONObject("picture")
                    val object_data = object_pic.optJSONObject("data")
                    val photo = object_data.optString("url")
                    //獲取地域信息
                    val locale = optString("locale") //zh_CN 代表中文簡體
                    
                }
            }
        })
        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()
    }

    fun getCallbackManager(): CallbackManager? {
        return callbackManager
    }

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

    companion object {

        /**
         * 是否處在登陸狀態
         */
        fun isLogin(): Boolean {
            val accessToken = AccessToken.getCurrentAccessToken()
            val isLoggedIn = accessToken != null && !accessToken.isExpired
            return isLogin()
        }
    }
}

Activity 使用示范

package com.enjoy.literaturemodule.account

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import com.enjoy.literaturemodule.R
import com.enjoy.literaturemodule.account.login.facebook.FacebookLoginUtil
import kotlinx.android.synthetic.main.activity_login.*

/**
 * 登陸
 */
class LoginActivity : Activity() {

    private var faceBookUtil: FacebookLoginUtil? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
        faceBookUtil = FacebookLoginUtil(this)

        facebook_login?.setOnClickListener {
            faceBookUtil?.login()
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        //facebook 登陸
        //facebook回調
        faceBookUtil?.getCallbackManager()?.onActivityResult(requestCode, resultCode, data)
        super.onActivityResult(requestCode, resultCode, data)
    }
}

 

 

        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM