Android 應用程式整合FaceBook 登入及二次封裝

來源:互聯網
上載者:User

標籤:

1、首先在Facebook 開發人員平台註冊一個帳號

        https://developers.facebook.com/

      開發人員後台  https://developers.facebook.com/apps

2、建立帳號並且獲得 APP ID 

        圖一

        

       圖二

             

       圖三

      

      圖四

        

     圖五

      

 

 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 context19      * @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

                    

          3.2.2 :解壓下載的檔案         

                   

 

        3.2.3:cmd 命令列模式定位到 openssl 的 bin目錄下

                  

       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 代表簽名的路徑,需要換成你簽名的路徑

                       

                               

       

       3.2.5 如果你的電腦上沒有下載 openssl 那麼你執行下面的代碼會出現

                     

 

 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 在布局檔案中定義登入按鈕
1234567 <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     @Override29     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             @Override43             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 @Override49 public void onCancel() {50 Toast.makeText(LoginLoginActivity.this, "facebook登入取消了", Toast.LENGTH_SHORT).show();51 log("facebook登入取消了");52 }53 54 @Override55 public void onError(FacebookException error) {56 Toast.makeText(LoginLoginActivity.this, "facebook登入失敗了", Toast.LENGTH_SHORT).show();57 log("facebook登入失敗了");58 }59 });60 61 }62 63 @Override64 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" ) ;   //比如:156545522156511                     String name = object.optString( "name" ) ;  //比如:Zhang San12                     String gender = object.optString("gender") ;  //性別:比如 male (男)  female (女)13                     String emali = object.optString("email") ;  //郵箱:比如:[email protected]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 accessToken106      */107     public void getLoginInfo( AccessToken accessToken ){108         GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {109             @Override110             public void onCompleted(JSONObject object, GraphResponse response) {111                 if (object != null) {112                     String id = object.optString("id");   //比如:1565455221565113                     String name = object.optString("name");  //比如:Zhang San114                     String gender = object.optString("gender");  //性別:比如 male (男)  female (女)115                     String emali = object.optString("email");  //郵箱:比如:[email protected]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      * 擷取loginMananger138      * @return139      */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 facebookListener154      */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 @Override2     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     }
 

 

    

Android 應用程式整合FaceBook 登入及二次封裝

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.