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

五陵年少金市东,银鞍白马渡春风。这篇文章主要讲述Android 应用程序集成FaceBook 登录及二次封装相关的知识,希望能为你提供帮助。
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 packageNameapp的包名 20*/ 21public static void getKeyHash( Context context , String packageName ){ 22try { 23PackageInfo info = null; 24info = context.getPackageManager().getPackageInfo( packageName , PackageManager.GET_SIGNATURES ); 25for ( Signature signature : info.signatures ) { 26MessageDigest messageDigest = null; 27messageDigest = MessageDigest.getInstance("SHA"); 28messageDigest.update(signature.toByteArray()); 29String hs = Base64.encodeToString(messageDigest.digest(), Base64.DEFAULT) ; 30Toast.makeText(context, "" + hs , Toast.LENGTH_SHORT).show(); 31} 32} catch (PackageManager.NameNotFoundException e) { 33e.printStackTrace(); 34} catch (NoSuchAlgorithmException e) { 35e.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="https://www.songbingjia.com/android/@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 在布局文件中定义登录按钮
1 2 3 4 5 6 7 < 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) 24public LoginButton facebook_bt; 25 26private CallbackManager callbackManager ; 27 28@Override 29protected void onCreate(Bundle savedInstanceState) { 30super.onCreate(savedInstanceState); 31setContentView(R.layout.activity_login); 32 33ButterKnife.bind(this); 34callbackManager = CallbackManager.Factory.create() ; 35 36init(); 37} 38 39private void init() { 40 41facebook_bt.registerCallback(callbackManager, new FacebookCallback< LoginResult> () { 42@Override 43public void onSuccess(LoginResult loginResult) { 44Toast.makeText(LoginLoginActivity.this, "facebook登录成功了", Toast.LENGTH_SHORT).show(); 45log("facebook登录成功了" + loginResult.getAccessToken());
//获取登录信息
getLoginInfo( loginResult.getAccessToken() ) ; 46} 47 48@Override 49public void onCancel() { 50Toast.makeText(LoginLoginActivity.this, "facebook登录取消了", Toast.LENGTH_SHORT).show(); 51log("facebook登录取消了"); 52} 53 54@Override 55public void onError(FacebookException error) { 56Toast.makeText(LoginLoginActivity.this, "facebook登录失败了", Toast.LENGTH_SHORT).show(); 57log("facebook登录失败了"); 58} 59}); 60 61} 62 63@Override 64protected void onActivityResult(int requestCode, int resultCode, Intent data) { 65super.onActivityResult(requestCode, resultCode, data); 66 67//facebook回调 68callbackManager.onActivityResult( requestCode , resultCode ,data ) ; 69} 70 }

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

    在 activity  使用
 
1//初始化Facebook登录服务 2FaceBookLoginfaceBookLogin = new FaceBookLogin( this ) ; 3 4//登录 5faceBookLogin.login(); 6 7//退出 8faceBookLogin.logout();

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

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

    推荐阅读