SDK 提供两种方法进行身份认证,一种称之为单点登录,如果安装了的话,它使用原生的 Facebook 应用程序对话框,另一种是默认的 WebView 方法。这里介绍的是WebView的方法。Facebook Dialog 类实现了一个 WebView 及其创建它的方法以及用于处理 Facebook URL(状态)响应的逻辑。

1、打开 res/layout/activity_main.xml,在布局中添加一个facebook登录按钮

1.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2.    xmlns:tools="http://schemas.android.com/tools"
3.    android:layout_width="match_parent"
4.    android:layout_height="match_parent"
5.    android:orientation="vertical"
6.    tools:context=".MainActivity" >
7.
8.    <com.facebook.widget.LoginButton
9.        android:id="@+id/login_button"
10.        android:layout_width="wrap_content"
11.        android:layout_height="wrap_content"
12.        android:layout_gravity="center_horizontal"
13.        android:layout_marginBottom="30dp"
14.        android:layout_marginTop="30dp" />
15.</LinearLayout>  

2、 创建MainFragment 类,并且继承Fragment 类,重写onCreateView()方法

通过LoginButton设置权限 setReadPermissions()    更多权限访问 http://developers.facebook.com/docs/reference/login/#permissions

重写 onSessionStateChange()方法  ,作用:当session状态改变时调用该方法,state.isOpened() 为 true 时,则证明登录成功!

 package com.example.kam;
1.
2.import java.util.Arrays;
3.
4.import android.content.Intent;
5.import android.os.Bundle;
6.import android.support.v4.app.Fragment;
7.import android.util.Log;
8.import android.view.LayoutInflater;
9.import android.view.View;
10.import android.view.ViewGroup;
11.
12.import com.facebook.Session;
13.import com.facebook.SessionState;
14.import com.facebook.UiLifecycleHelper;
15.import com.facebook.widget.LoginButton;
16.
17.public class MainFragment extends Fragment {
18.    private static final String TAG = "MainFragment";
19.    private UiLifecycleHelper uiHelper;
20.
21.    private Session.StatusCallback callback = new Session.StatusCallback() {
22.        @Override
23.        public void call(Session session, SessionState state,
24.                Exception exception) {
25.            onSessionStateChange(session, state, exception);
26.        }
27.    };
28.
29.    @Override
30.    public void onCreate(Bundle savedInstanceState) {
31.        super.onCreate(savedInstanceState);
32.        uiHelper = new UiLifecycleHelper(getActivity(), callback);
33.        uiHelper.onCreate(savedInstanceState);
34.    }
35.
36.    @Override
37.    public View onCreateView(LayoutInflater inflater, ViewGroup container,
38.            Bundle savedInstanceState) {
39.        View view = inflater.inflate(R.layout.activity_main, container, false);
40.
41.        LoginButton authButton = (LoginButton) view
42.                .findViewById(R.id.login_button);
43.        authButton.setFragment(this);
44.        authButton.setReadPermissions(Arrays
45.                .asList("email","user_likes", "user_status"));
46.        return view;
47.    }
48.
49.    private void onSessionStateChange(Session session, SessionState state,
50.            Exception exception) {
51.        if (state.isOpened()) {
52.            Log.i(TAG, "Logged in...");
53.        } else if (state.isClosed()) {
54.            Log.i(TAG, "Logged out...");
55.        }
56.    }
57.
58.    @Override
59.    public void onResume() {
60.        super.onResume();
61.
62.        // For scenarios where the main activity is launched and user
63.        // session is not null, the session state change notification
64.        // may not be triggered. Trigger it if it's open/closed.
65.        Session session = Session.getActiveSession();
66.        if (session != null && (session.isOpened() || session.isClosed())) {
67.            onSessionStateChange(session, session.getState(), null);
68.        }
69.
70.        uiHelper.onResume();
71.    }
72.
73.    @Override
74.    public void onActivityResult(int requestCode, int resultCode, Intent data) {
75.        super.onActivityResult(requestCode, resultCode, data);
76.        uiHelper.onActivityResult(requestCode, resultCode, data);
77.    }
78.
79.    @Override
80.    public void onPause() {
81.        super.onPause();
82.        uiHelper.onPause();
83.    }
84.
85.    @Override
86.    public void onDestroy() {
87.        super.onDestroy();
88.        uiHelper.onDestroy();
89.    }
90.
91.    @Override
92.    public void onSaveInstanceState(Bundle outState) {
93.        super.onSaveInstanceState(outState);
94.        uiHelper.onSaveInstanceState(outState);
95.    }
96.}  

3、MainActivity 类 ,继承FragmentActivity类  ,初始化 添加MainFragment 类,打印哈希值可写可不写

1.package com.example.kam;
2.
3.import java.security.MessageDigest;
4.import java.security.NoSuchAlgorithmException;
5.
6.import android.content.pm.PackageInfo;
7.import android.content.pm.PackageManager;
8.import android.content.pm.PackageManager.NameNotFoundException;
9.import android.content.pm.Signature;
10.import android.os.Bundle;
11.import android.support.v4.app.FragmentActivity;
12.import android.util.Base64;
13.import android.util.Log;
14.import android.view.Menu;
15.
16.public class MainActivity extends FragmentActivity {
17.
18.    private MainFragment mainFragment;
19.
20.    @Override
21.    protected void onCreate(Bundle savedInstanceState) {
22.        super.onCreate(savedInstanceState);
23.        if (savedInstanceState == null) {
24.            // Add the fragment on initial activity setup
25.            mainFragment = new MainFragment();
26.            getSupportFragmentManager()
27.            .beginTransaction()
28.            .add(android.R.id.content, mainFragment)
29.            .commit();
30.       } else {
31.          // Or set the fragment from restored state info
32.           mainFragment = (MainFragment) getSupportFragmentManager()
33.           .findFragmentById(android.R.id.content);
34.       }
35.
36.        /**
37.         * 打印哈希值
38.         */
39.        try {
40.            PackageInfo info = getPackageManager().getPackageInfo(
41.                    "com.example.kam",
42.                    PackageManager.GET_SIGNATURES);
43.            for (Signature signature : info.signatures) {
44.                MessageDigest md = MessageDigest.getInstance("SHA");
45.                md.update(signature.toByteArray());
46.                Log.i("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
47.                }
48.        } catch (NameNotFoundException e) {
49.
50.        } catch (NoSuchAlgorithmException e) {
51.
52.        }
53.    }
54.
55.
56.    @Override
57.    public boolean onCreateOptionsMenu(Menu menu) {
58.        // Inflate the menu; this adds items to the action bar if it is present.
59.        getMenuInflater().inflate(R.menu.activity_main, menu);
60.        return true;
61.    }
62.}  

4、AndroidMainfest.xml 添加 facebook LoginActivity(登录activity)

<activity android:name="com.facebook.LoginActivity"/>

5、运行项目 成功运行后登录按钮变成Log Out, 点击Log Out则注销

【FacebookSDK学习笔记】登录Facebook相关推荐

  1. xmall商城学习笔记 登录

    xmall商城学习笔记 文章目录 xmall商城学习笔记 前言 一.单点登录是什么? 二.项目结构 总结 前言 提示:今天要看的xmall-sso,单点登录模块 一.单点登录是什么? 简单讲就是在一个 ...

  2. vue3小兔鲜商城项目学习笔记+资料分享05

    建议大家先去看我第一篇小兔鲜的文章,强烈建议,非常建议,十分建议,从头开始看更完整. 最近正在学习vue3小兔鲜, 下面是学习笔记 登录模块 路由与组件 目标:登录组件在书写一级路由的时候已经准备,添 ...

  3. Spring Security技术栈学习笔记(十四)使用Spring Social集成QQ登录验证方式

    上一篇文章<Spring Security技术栈开发企业级认证与授权(十三)Spring Social集成第三方登录验证开发流程介绍>主要是介绍了OAuth2协议的基本内容以及Spring ...

  4. SilverLight学习笔记--如何在xaml文件中操作用户在后台代码定义的类(2)--示例篇:创建一个登录控件(原创)(转载本文请注明出处)...

    本文将示例如何运用前篇所写知识来建立一个用户自定义的登录控件.此控件界面非常简单,主要涉及的知识点是:   如何创建用户控件(包括对此控件的自定义事件和属性的编写,此处我们将创建一个名为LoginBo ...

  5. JavaWeb-综合案例(用户信息)-学习笔记02【登录功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...

  6. JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  7. oracle 触发器登录,【学习笔记】Oracle触发器 实现指定用户登录oracle案例

    天萃荷净 触发器实现指定用户登录oracle,分享一篇关于Oracle数据库安全策略,通过Oracle触发器实现限定user用户登录Oracle数据库的方法 1.创建允许登录用户表 CREATE TA ...

  8. Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能

    Vue + Spring Boot 学习笔记02:引入数据库实现用户登录功能 在学习笔记01里,我们利用跨域打通了前端的Vue与后端的Spring Boot,实现了用户登录功能,但是后台的登录控制器在 ...

  9. Vue + Spring Boot 学习笔记01:实现用户登录功能

    Vue + Spring Boot 学习笔记01:实现用户登录功能 一.创建后端Spring Boot项目Book Management 二.创建前端Vue项目bm-vue 三.修改后端项目Book ...

最新文章

  1. RJ-45接口连接线、MDI/MDIX接口
  2. 发个上海英雄会聚会沙龙的公告 希望和大家一起见面交流探讨
  3. 魔兽三国服务器维护,魔兽三国开服七天技巧
  4. 全局使用dva dispatch
  5. 61setproperty对象
  6. Java线程volatile(二)
  7. Python str字符串常用到的函数
  8. 匈牙利算法【匹配问题】
  9. Linux内存管理 - slab分配器和kmalloc
  10. WeWork上演宫斗大戏,这个市还上吗?
  11. 微信公众号网页授权40029错误「建议收藏」
  12. 联通数据采集交换平台BDE的配置
  13. 图片切换上一页 下一页
  14. js两数字相除 保留两位小数
  15. Windows10蓝屏触发及分析
  16. JavaScript权威指南 第11章JavaScript标准库
  17. u盘中Trojan.Generic病毒
  18. Uva1218 Perfect Services
  19. 站住!我要送你点网格智能干货
  20. 常见的分布式数据库有哪些

热门文章

  1. 大数据技术之Hadoop(MapReduce)
  2. artTemplate-3.0(与项目实际结合)
  3. 《深入理解JAVA虚拟机》周志明 第三版 - 第二章 JAVA内存区域与内存溢出异常
  4. 教你如何写出高质量的网络推广软文
  5. python斐波那契数列第四十项_传统文化的数学基础(四)--论八卦、五行、天干地支、二十四节气、洛书与黄金分...
  6. 洛谷P2832 行路难
  7. 高德地图车机版增加地标性品牌图标 让你“约会”无压力
  8. 如何让google,baidu,Yahoo收录你的网站
  9. npm安装electron时卡死 ,而利用cnpm安装electron时失败(等一系列幺蛾子)
  10. 小学计算机小蘑菇教案,小学美术:《画蘑菇》教学设计