且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Android 应用程序集成FaceBook 登录及二次封装

更新时间:2022-06-26 01:59:20

1、首先在Facebook 开发者平台注册一个账号

        https://developers.facebook.com/

      开发者后台  https://developers.facebook.com/apps

2、创建账号并且获得 APP ID 

        图一

        Android 应用程序集成FaceBook 登录及二次封装

       图二

        Android 应用程序集成FaceBook 登录及二次封装     

       图三

      Android 应用程序集成FaceBook 登录及二次封装

      图四

        Android 应用程序集成FaceBook 登录及二次封装

     图五

      Android 应用程序集成FaceBook 登录及二次封装

 

 3、获取app签名的Key Hashes 值(两种方式)

         3.1方法1:         

 1 package com.pegasus.map.presentation.utils;
 2 import android.content.Context;
 3 import android.content.pm.PackageInfo;
 4 import android.content.pm.PackageManager;
 5 import android.content.pm.Signature;
 6 import android.util.Base64;
 7 import android.widget.Toast;
 8 import java.security.MessageDigest;
 9 import java.security.NoSuchAlgorithmException;
10 
11 /**
12  * Created by ${zyj} on 2016/3/29.
13  */
14 public class KeyHash {
15 
16     /**
17      * 注意运行的时候,app需要正式的签名
18      * @param context
19      * @param packageName  app的包名
20      */
21     public static void getKeyHash( Context context , String packageName ){
22         try {
23             PackageInfo info = null;
24             info = context.getPackageManager().getPackageInfo( packageName , PackageManager.GET_SIGNATURES );
25             for ( Signature signature : info.signatures ) {
26                 MessageDigest messageDigest = null;
27                 messageDigest = MessageDigest.getInstance("SHA");
28                 messageDigest.update(signature.toByteArray());
29                 String hs = Base64.encodeToString(messageDigest.digest(), Base64.DEFAULT) ;
30                 Toast.makeText(context, "" + hs , Toast.LENGTH_SHORT).show();
31             }
32         } catch (PackageManager.NameNotFoundException e) {
33             e.printStackTrace();
34         } catch (NoSuchAlgorithmException e) {
35             e.printStackTrace();
36         }
37     }
38 }

        3.2 命令行的方式获取 Key hash 值

            3.2.1 :首选保证你的电脑上有 openSSl 的库文件

                       下载  http://gnuwin32.sourceforge.net/packages/openssl.htm

                    Android 应用程序集成FaceBook 登录及二次封装

          3.2.2 :解压下载的文件         

                   Android 应用程序集成FaceBook 登录及二次封装

 

        3.2.3:cmd 命令行模式定位到 openssl 的 bin目录下

                  Android 应用程序集成FaceBook 登录及二次封装

       3.2.4:执行命令

                 keytool -exportcert -alias yiba -keystore C:\work\Key.jks | openssl sha1 -binary | openssl base64

                注意: 1、这里的 yiba 代表app签名的别名,也就是 alias 

                          2、C:\work\Key.jks 代表签名的路径,需要换成你签名的路径

                Android 应用程序集成FaceBook 登录及二次封装       

               Android 应用程序集成FaceBook 登录及二次封装                

       

       3.2.5 如果你的电脑上没有下载 openssl 那么你执行下面的代码会出现

               Android 应用程序集成FaceBook 登录及二次封装      

 

 4、设置应用的基本配置

         图一

         Android 应用程序集成FaceBook 登录及二次封装

      图二

        Android 应用程序集成FaceBook 登录及二次封装

      图三

       Android 应用程序集成FaceBook 登录及二次封装

         

 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 企业账号需要注意的事项,把发布按钮打开

         Android 应用程序集成FaceBook 登录及二次封装

                      

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     }