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

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 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

                    

          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-dataandroid: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.LoginButtonandroid: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     }

 

     

 

 

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IKAnalyzer进行中文分词和去停用词

最近学习主题模型pLSA、LDA&#xff0c;就想拿来试试中文。首先就是找文本进行切词、去停用词等预处理&#xff0c;这里我找了开源工具IKAnalyzer2012&#xff0c;下载地址&#xff1a;(&#xff1a;(注意&#xff1a;这里尽量下载最新版本&#xff0c;我这里用的IKAnalyzer201…

C++从0到1的入门级教学(六)——函数

文章目录6 函数6.1 概述6.2 函数的定义6.3 函数的调用6.4 值传递6.5 函数的常见形式6.6 函数的声明6.7 函数的分文件编写6 函数 6.1 概述 作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码。 一个较大的程序&#xff0c;一般分为若干个程序块&#xf…

PC实用手册

为什么80%的码农都做不了架构师&#xff1f;>>> ##Win10除了Edge/IE&#xff0c;其他浏览器打开和载入速度都很慢 解决办法&#xff1a;以管理员身份运行cmd&#xff0c;输入netsh winsock reset重置winsock&#xff0c;然后重启电脑即可 转载于:https://my.oschin…

MySQL之表的约束

一 介绍 约束条件与数据类型的宽度一样&#xff0c;都是可选参数 作用&#xff1a;用于保证数据的完整性和一致性主要分为&#xff1a; PRIMARY KEY (PK) 标识该字段为该表的主键&#xff0c;可以唯一的标识记录 FOREIGN KEY (FK) 标识该字段为该表的外键 NOT NULL 标…

eclipse静态部署tomcat

转载于:https://www.cnblogs.com/sprinng/p/4223798.html

jvm fastdebug

背景 RednaxelaFX 写道agapple 写道还有一个问题&#xff0c;就是在验证一些逃逸优化时&#xff0c;有些jvm参数用不了&#xff0c;比如-XX:printInlining&#xff0c;-XX:printAssembly&#xff0c;jdk用的是1.6.11和jdk1.6.18-XX:PrintInlining在product build的Sun JDK上可以…

设计模式杂谈(一)——设计模式概述

文章目录1 设计模式概述1.1 软件设计模式的产生背景1.2 软件设计模式的概念1.3 设计模式的必要性1.4 设计模式分类1 设计模式概述 1.1 软件设计模式的产生背景 设计模式最初并不是在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚…

hmailserver批量添加用户

2019独角兽企业重金招聘Python工程师标准>>> 将内容复制到txt文件中后缀改为vbs 将用户名密码替换为自己的 脚本内容如下: Option Explicit On Error resume nextDim obBaseApp Dim objFSO Dim objTextFile Dim strNewAlias,iDim scrreport Dim failed Dim added fa…

云说的到底对不对,京东到底行不行?

摘要&#xff1a;马云吐槽京东被引爆以来&#xff0c;似乎就没人去关注马云说的对不对&#xff0c;有没有价值&#xff0c;大家更多的是在关注马云攻击了京东&#xff0c;京东回击了马云&#xff0c;马云被偷录了&#xff0c;再和人说话要去澡堂了…但&#xff0c;马云说的到底…

JS-随机生成的密码

randPassword(size) >{ //数组 let seed new Array(A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z, a,b,c,d,e,f,g,h,i,j,k,m,n,p,Q,r,s,t,u,v,w,x,y,z, 2,3,4,5,6,7,8,9 ) //数组长度 seedlength seed.length; let creatPassword[]; for (i0;i<size;i) { j Mat…

数据库杂谈(九)——事务管理

文章目录9 事务管理9.1 恢复机制9.2 事务和日志9.2.1 事务9.2.2 运行记录的结构9.2.2.1 活动事务表9.2.2.2 提交事务表9.2.2.3 日志9.2.3 提交规则和先记后写规则9.2.3.1 提交规则9.2.3.2 先记后写规则9.3 更新策略以及故障后的恢复9 事务管理 9.1 恢复机制 数据对一个单位是…

CSS邮件相关

转载于:https://blog.51cto.com/8465917/1758775

MySql 错误 Err [Imp] 1153 - Got a packet bigger than 'max_allowed_packet' bytes

今天在用Navicat导入SQL文件时报错&#xff1a;MySql 错误 Err [Imp] 1153 - Got a packet bigger than max_allowed_packet bytes 查了一下&#xff0c;原来是MySQL默认读取执行的SQL文件最大为16M&#xff0c;我这个SQL文件260M&#xff0c;所以执行不过去 解决方法&#xff…

沙箱模式以及其使用到的IIFE

//沙箱//与外界隔绝的一个环境&#xff0c;外界无法修改该环境内任何信息&#xff0c;沙箱内的东西单独属于一个世界//360沙箱模式//将软件和操作系统进行隔离&#xff0c;以达到安全的目的//苹果手的app使用的就是沙箱模式去运行//隔离app的空间&#xff0c;每个app独立运行//…

C++从0到1的入门级教学(十)——类和对象

文章目录10 类和对象10.1 封装10.1.1 封装的意义10.1.2 struct和class的区别10.1.3 成员属性设置为私有10.2 对象的初始化和清理10.2.1 构造函数和析构函数10.2.2 构造函数的分类及调用10.2.3 关于拷贝构造函数调用时机10.2.4 构造函数调用规则10.2.5 深拷贝和浅拷贝10.2.6 初始…

js二级导航

js写二级导航要点 1.ul li 2.js获取元素 3.setInterval(function(),time); 代码如下 1 <style type"text/css">2 ul,li,body{margin:0;padding: 0;}3 #nav{width: 500px;margin: 10px auto;}4 ul li{list-style: none;}5 .clear{clear: both;}6 #n…

关于STM32的两个小问题的总结

一、最近做了一个关于自动转速测试仪的项目&#xff0c;其中用到了STM32的RTC时钟的功能&#xff0c;然后开始写代码&#xff0c;并且成功的跑了起来&#xff0c;于是将自己的板子放到桌面上让它跑了一个晚上看下误差&#xff0c;结果发现经过一晚上&#xff0c;误差并不是很大…

深度学习修炼(六)——神经网络分类问题

文章目录6 分类任务6.1 前置知识6.1.1 分类6.1.2 分类的网络6.2 动手6.2.1 读取数据6.2.2 functional模块6.2.3 继续搭建分类神经网络6.2.4 继续简化6.2.5 训练模型6.3 暂退法6.3.1 重新看待过拟合问题6.3.2 在稳健性中加入扰动6.3.3 暂退法实际的实现6.4 后话6 分类任务 在这…

修改NavigationBar的分根线颜色

[self.navigationController.navigationBar setShadowImage:[Static ColorToImage:[Static colorWithHexString:[UIColor red]]]]; Static 里的几个静态方法 (UIImage *)ColorToImage:(UIColor *)color{CGRect rectCGRectMake(0.0f, 0.0f, 1.0f, 1.0f);UIGraphicsBeginImageCo…

Java IO 之 InputStream源码(2)

Writer&#xff1a;李强强 一、InputStream InputStream是一个抽象类&#xff0c;即表示所有字节输入流实现类的基类。它的作用就是抽象地表示所有从不同数据源产生输入的类&#xff0c;例如常见的FileInputStream、FilterInputStream等。那些数据源呢&#xff1f;比如&#xf…