Android——第三方Facebook授权登录获取用户信息

2023-10-26

由于项目中需要使用Facebook进行一键登录,所以记录下步骤,其实小伙伴直接看官网也可以,介绍的蛮详细的,先看下效果图吧。


遵循以下步骤将Facebook登录添加到您的应用。
Facebook开发者网站:https://developers.facebook.com/apps/

1.选择应用或新建应用

选择应用或新建应用,将应用相关信息输入以下代码片段。

2.下载Facebook应用

点击下方的按钮,下载Facebook应用。
下载Android版Facebook

3.集成的Facebook SDK

Android版Facebook登录SDK是Android版Facebook SDK的一个组件。如要在您的项目中使用Facebook登录SDK,请转变为Maven中的一个依赖项,或者将其下载下来。如需在Android 11中支持这些更改,请使用SDK版本8.1或更高版本。

使用Maven

  1. 在您的项目中,打开your_app > Gradle脚本build.gradle(Project),确保以下存储库都添加到buildscript { repositories {}}中:
jcenter () 
  1. 在您的项目中,打开your_app > Gradle脚本build.gradle(模块:app)依次执行语句添加到dependencies{}部分,踩依赖于最新版的Facebook登录SDK:
implementation 'com.facebook.android:facebook-login:[8.1)'
  1. 构建项目。
    使用 Facebook 登录 SDK 时,如果未禁用事件自动记录功能,那么系统将自动记录和收集应用事件,以用于 Facebook 分析。关于哪些信息会被收集以及如何禁用事件自动记录的详细信息,请参阅应用事件自动记录

4.编辑您的资源和清单

如果您使用 Android 版 Facebook SDK 版本 5.15 或更高版本,则不需要为 Chrome 自定义选项卡添加活动或意图筛选条件。此功能包含在 SDK 中。

为您的 Facebook 应用编号以及启用 Chrome 自定义选项卡所需的 Facebook 应用编号创建字符串。另外,请将 FacebookActivity 添加到您的 Android 清单文件中。
1.打开您的 /app/res/values/strings.xml 文件。
2.添加如下所示的代码:

<string name="facebook_app_id">你的项目生成的ID</string> 
<string name="fb_login_protocol_scheme">fb你的项目生成的ID</string>

3.打开 /app/manifest/AndroidManifest.xml 文件。
4.在 application 元素后添加以下 uses-permission 元素:

<uses-permission android:name="android.permission.INTERNET"/>

5.在 application 元素中添加以下 meta-data 元素、一个针对 Facebook 的 activity 元素以及一个针对 Chrome 自定义选项卡的 activity 元素和意向筛选条件:

<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:label="@string/app_name" /> 
<activity android:name="com.facebook.CustomTabActivity" 
android:exported="true"> 
<intent-filter> 
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> 
<category android:name="android.intent.category.BROWSABLE" /> 
<data android:scheme="@string/fb_login_protocol_scheme" />
</intent-filter> 
</activity>

5.将软件包名称和默认类与应用进行关联

软件包名称
软件包名称是 Android 应用的唯一标识。如果用户未下载您的应用,我们就会使用此名称让他们能在 Google Play 找到应用并下载。您可以在 Android Manifest 文件或应用的 build.gradle 文件中找到此信息。

你项目的包名

默认活动类名称
这是处理深度链接的 activity(如 com.example.app.DeepLinkingActivity)的完整且合格的类名称。从 Facebook 应用深度链接至您的应用时,我们就会使用此名称。您也可以在 Android 清单文件中找到该名称。

activity的路径信息

6.为应用提供开发和发布密钥散列

为确保您的应用和 Facebook 之间互动的真实性,您需要向我们提供适用于您开发环境的 Android 密钥散列。如果您的应用已经发布,则还应该添加发布密钥散列。

生成开发密钥散列

每个 Android 开发环境都将会有一个唯一的开发密钥散列。

Mac OS

您将需要 Java 开发包中的密钥和证书管理工具 (keytool)。
如要生成开发密钥散列,请打开终端窗口,运行以下命令:

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64

Windows
您需要以下各项:

  • Java 开发包中的密钥和证书管理工具 (keytool)
  • Google Code Archive 的 Windows 版 openssl-for-windows OpenSSL 库
    如要生成开发密钥散列,请在 Java SDK 文件夹的命令提示符中运行以下命令:
keytool -exportcert -alias androiddebugkey -keystore "C:\Users\USERNAME\.android\debug.keystore" | "PATH_TO_OPENSSL_LIBRARY\bin\openssl" sha1 -binary | "PATH_TO_OPENSSL_LIBRARY\bin\openssl" base64

此命令将针对您的开发环境生成一个包含 28 个字符的唯一密钥散列。将其复制粘贴到下方字段中。您需要向每位应用开发人员的开发环境分别提供开发密钥散列。

生成发布密钥散列

Android 应用必须先使用发布密钥进行电子签名,然后才能上传到商店中。如要生成发布密钥散列,请在 Mac 或 Windows 内运行以下命令,并替换您的发布密钥别名和密钥库路径:

keytool -exportcert -alias YOUR_RELEASE_KEY_ALIAS -keystore YOUR_RELEASE_KEY_PATH | openssl sha1 -binary | openssl base64

这会生成一个包含 28 个字符的字符串,您应将其复制粘贴到下方字段中。另外,请参阅 Android 文档,了解有关应用签名的信息,也可以代码获取,这样更简单。

try {
            int i = 0;
            PackageInfo info = getPackageManager().getPackageInfo( getPackageName(),  PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                i++;
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                String KeyHash = Base64.encodeToString(md.digest(), Base64.DEFAULT);
                //KeyHash 就是你要的,不用改任何代码  复制粘贴 ;
                Log.e("获取应用KeyHash", "KeyHash: " + KeyHash);
            }
        }
        catch (Exception e) {
        }

7.为应用启用单点登录

启用单点登录
如果您想为 Android 通知添加启动应用的功能,请启用单点登录。

8.添加 Facebook“登录”按钮

向应用添加“Facebook 登录”按钮的最简单方法是从 SDK 添加 LoginButton。LoginButton 是一个界面元素,其中包含 LoginManager 具备的功能。用户点击按钮后,就会以 LoginManager 中设置的权限开始登录。按钮随登录状态变化,并根据用户的身份验证状态显示正确文本。
要添加 Facebook 登录按钮,请先将其添加到布局 XML 文件中:(官网中提供了Facebook SDK内置的登录按钮,但大部分开发中,我们都是有自己的一套UI,所以我就只介绍自定义登录按钮的流程了。)

<LinearLayout
        android:id="@+id/btn_login"
        android:layout_width="match_parent"
        android:layout_height="55dp"
        android:layout_margin="20dp"
        android:background="@drawable/bg_button"
        android:gravity="center"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:text="Facebook登录"
            android:textColor="@color/white"
            android:textSize="19sp"
            tools:ignore="HardcodedText" />
</LinearLayout>

9.注册回调

现在调用 CallbackManager.Factory.create,创建 callbackManager,以便处理登录响应。

callbackManager = CallbackManager.Factory.create();

下面是完整代码:

public class MainActivity extends AppCompatActivity {

    private ImageView tx_PictureUrl;
    private TextView tx_DisplayName;
    private TextView tx_UserId;
    private CallbackManager callbackManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tx_PictureUrl = findViewById(R.id.tx_PictureUrl);
        tx_DisplayName = findViewById(R.id.tx_DisplayName);
        tx_UserId = findViewById(R.id.tx_UserId);
        callbackManager = CallbackManager.Factory.create();
        LinearLayout loginButton = findViewById(R.id.btn_login);
        loginButton.setOnClickListener(v -> LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile", "user_friends")));
        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {

            @Override
            public void onCancel() {
                CookieSyncManager.createInstance(MainActivity.this);
                CookieManager cookieManager = CookieManager.getInstance();
                cookieManager.removeAllCookie();
                CookieSyncManager.getInstance().sync();
            }

            @Override
            public void onError(FacebookException arg0) {
                Log.d("onError", arg0.toString());
            }

            @Override
            public void onSuccess(LoginResult arg0) {
                Log.d("onSuccess", "登录成功!");
                updateUI();
            }
        });
    }

    @SuppressLint("SetTextI18n")
    private void updateUI() {
        boolean enableButtons = AccessToken.getCurrentAccessToken() != null;
        Profile profile = Profile.getCurrentProfile();
        if (enableButtons && profile != null) {
            Glide.with(MainActivity.this).load(profile.getProfilePictureUri(150, 150).toString()).into(tx_PictureUrl);
            tx_DisplayName.setText("昵称:" + profile.getName());
            tx_UserId.setText("UserId:" + AccessToken.getCurrentAccessToken().getUserId());
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode,
                resultCode, data);
    }


    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }
}

注意:如果应用没有发布的话,只有开发者和测试者可以访问,因为是测试的账号发布了几次还是失败,所以暂时还未发布。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android——第三方Facebook授权登录获取用户信息 的相关文章

随机推荐

  • Conda错误:Collecting package metadata (current_repodata.json): failed

    conda新安装设置清华源后发现并没有使用 且会出现错误 Collecting package metadata current repodata json failed 换了科大源也没成功 考虑可能是默认源的问题 删除 condarc文件
  • TCP/IP详解学习笔记(4)-ICMP协议,ping和Traceroute

    1 IMCP协议介绍 前面讲到了 IP协议并不是一个可靠的协议 它不保证数据被送达 那么 自然的 保证数据送达的工作应该由其他的模块来完成 其中一个重要的模块就是ICMP 网络控制报文 协议 当传送IP数据包发生错误 比如主机不可达 路由不
  • STM32F103ZET6【HAL函开发】STM32CUBEMX------1.GPIO输出-点亮led灯

    一 硬件介绍 正点原子战舰开发板 主控芯片STM32F103ZET6 两个LED分别连接到单片机的PB5和PE5 二 STM32CUBEMX基础配置 2 1 晶振配置 如果你的板子上外部高速晶振8M和外部低速晶振32 768K都有的话 那么
  • Java中如何自定义数组

    Java中如何自定义数组 数组是一种非常常见的数据结构 在Java中也是一个非常重要的概念 在Java中 数组的定义和使用非常简单 但是如果我们想要自定义数组 那么可能需要一些额外的操作 Java中如何自定义数组 在Java中 数组是一种简
  • 华为OD机试 - 分苹果(Java)

    题目描述 A B两个人把苹果分为两堆 A希望按照他的计算规则等分苹果 他的计算规则是按照二进制加法计算 并且不计算进位 12 5 9 1100 0101 9 B的计算规则是十进制加法 包括正常进位 B希望在满足A的情况下获取苹果重量最多 输
  • 【转载】区块链技术原理、应用领域及挑战

    区块链技术原理 应用领域及挑战 李董 魏进武 中国联合网络通信有限公司研究院 北京 100032 引用本文 李董 魏进武 区块链技术原理 应用领域及挑战 电信科学 J 2016 32 12 20 26 doi 10 11959 j issn
  • 小米手机解BL锁教程

    1 找到设置 找到我的设备 2 点击全部参数 多点几下miui版本 直到弹出开发者模式提醒 3 返回 找到更多设置 4 找到开发者选项
  • Linux设备上时间不准确?使用chrony服务配置时间服务器实现Linux时间同步以及实现主从设备时间同步

    本文基于Linux上CentOS 7版本配合chrony 需要使用yum自行下载 进行演示 目录 一 计算机设备上的两种时间 1 硬件时间 2 系统时间 二 配置同步时间服务器 1 安装服务 2 配置服务 三 搭建主从时间服务器 1 服务器
  • 阿里云提示ECS服务器存在漏洞处理方法

    1 阿里云提供生成修复命令 但是这个只提供给企业版 即收费的 2 自己手动修复的话 采用软件升级一般都可以解决 除了提示带kernel的高危漏洞的 其他的不需要重启实例即可修复 有kernel的需要更新完成重启实例 这里可以先把 漏洞名称
  • 2021-04-08 使用Eclipse进行Web前端开发

    使用Eclipse进行Web前端开发 前言 本机为微软Surface pro4 为64位 所用操作系统为Windos 10 使用的Java版本为1 8 0 151 使用的JDK版本为JDK8 注意事项 1 Eclipse安装插件的时候一定要
  • 【mac】Mac 安装 RabbitMQ

    文章目录 1 概述 2 安装brew 3 安装 4 安装RabiitMQ的可视化监控插件 5 配置环境变量 6 后台启动 rabbitMQ 7 创建rabbitmq账号 8 给账号配置角色 1 概述 学习spring cloud 的时候 因
  • 【pytorch】pytorch模型保存技巧

    Pytorch会把模型相关信息保存为一个字典结构的数据 以用于继续训练或者推理 1 保存与加载模型参数 这是最常见的模型保存与加载方式 保存方式如下 state model state dict torch save state xxx p
  • qml实现红绿灯切换功能

    题目要求 参考代码 https download csdn net download y478225902 5260541 实现源码 import QtQuick 2 12 import QtQuick Window 2 12 Window
  • springboot整合maven Profile实现properties文件多环境配置

    步骤 首先写几个properties的配置文件 一般这样的文件有三个 而且文件的名称也也可以随意 不论你们的项目是使用的springmvc还是springboot 文件名称都可以随意指定 例如我的几个文件 在文件中写一些测试的属性值 方便测
  • 【一】重温HTML

    引言 经典对答 面试官 你了解HTML吗 回答 啊 我是来面试前端的呀 我会Vue 面试官 写文思考 写这一系列文章的时候 自己思考了几个问题 HTML的文章太多了 为什么还要写 HTML的入门谁不会 还要学 HTML的文章基本都是水文 谁
  • ES6解构赋值

    前面的话 我们经常定义许多对象和数组 然后有组织地从中提取相关的信息片段 在ES6中添加了可以简化这种任务的新特性 解构 解构是一种打破数据结构 将其拆分为更小部分的过程 本文将详细介绍ES6解构赋值 引入 在ES5中 开发者们为了从对象和
  • Mysql中MVCC的使用及原理详解

    准备 测试环境 Mysql 5 7 20 log 数据库默认隔离级别 RR Repeatable Read 可重复读 MVCC主要适用于Mysql的RC RR隔离级别 创建一张存储引擎为testmvcc的表 sql为 CREATE TABL
  • error compiling template但编辑器内未报错,处理步骤。

    1 首先寻找自己所引入的组件当中 例如用到了某个方法 而自己没有把方法写上 2 寻找自己所引入的代码当中是否有重复的代码 可能是复制的时候多复制一行而导致的 3 寻找是否有空格所导致的error compiling template 报错
  • 到处是“坑”的strtok()—解读strtok()的隐含特性

    在用C C 实现字符串处理逻辑时 strtok函数的使用非常广泛 其主要作用是按照给定的字符集分隔字符串 并返回各子字符串 由于该函数的使用有诸多限制 如果使用不当就会造成很多 坑 因此本文首先介绍那些经常误踩的坑 然后通过分析源代码 解读
  • Android——第三方Facebook授权登录获取用户信息

    由于项目中需要使用Facebook进行一键登录 所以记录下步骤 其实小伙伴直接看官网也可以 介绍的蛮详细的 先看下效果图吧 遵循以下步骤将Facebook登录添加到您的应用 Facebook开发者网站 https developers fa