Android 应用程序集成FaceBook 登录及二次封装
1、首先在Facebook 开发者平台注册一个账号
https://developers.facebook.com/
开发者后台 https://developers.facebook.com/apps
2、创建账号并且获得 APP ID
图一

图二

图三

图四

图五

3、获取app签名的Key Hashes 值(两种方式)
获取方式:https://blog.csdn.net/zhaoyanjun6/article/details/105344657
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 在布局文件中定义登录按钮
<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 在代码中实现
package com.pegasus.map.presentation.ui.activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import com.pegasus.map.R;
import com.pegasus.map.presentation.ui.base.BaseActivity;
import butterknife.Bind;
import butterknife.ButterKnife; /**
* Created by ${zyj} on 2016/3/24.
* 登录
*/ public class LoginLoginActivity extends BaseActivity { @Bind(R.id.facebook_bt)
public LoginButton facebook_bt; private CallbackManager callbackManager ; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login); ButterKnife.bind(this);
callbackManager = CallbackManager.Factory.create() ; init();
} private void init() { facebook_bt.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Toast.makeText(LoginLoginActivity.this, "facebook登录成功了", Toast.LENGTH_SHORT).show();
log("facebook登录成功了" + loginResult.getAccessToken());
//获取登录信息
getLoginInfo( loginResult.getAccessToken() ) ;
} @Override
public void onCancel() {
Toast.makeText(LoginLoginActivity.this, "facebook登录取消了", Toast.LENGTH_SHORT).show();
log("facebook登录取消了");
} @Override
public void onError(FacebookException error) {
Toast.makeText(LoginLoginActivity.this, "facebook登录失败了", Toast.LENGTH_SHORT).show();
log("facebook登录失败了");
}
}); } @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); //facebook回调
callbackManager.onActivityResult( requestCode , resultCode ,data ) ;
}
}
/**
* 获取登录信息
* @param accessToken
*/
public void getLoginInfo( AccessToken accessToken ){
GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
if (object != null) {
String id = object.optString( "id" ) ; //比如:1565455221565
String name = object.optString( "name" ) ; //比如:Zhang San
String gender = object.optString("gender") ; //性别:比如 male (男) female (女)
String emali = object.optString("email") ; //邮箱:比如:56236545@qq.com //获取用户头像
JSONObject object_pic = object.optJSONObject( "picture" ) ;
JSONObject object_data = object_pic.optJSONObject( "data" ) ;
String photo = object_data.optString( "url" ) ; //获取地域信息
String locale = object.optString( "locale" ) ; //zh_CN 代表中文简体 Toast.makeText( activity , "" + object.toString() , Toast.LENGTH_SHORT).show();
}
}
}) ; Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link,gender,birthday,email,picture,locale,updated_time,timezone,age_range,first_name,last_name");
request.setParameters(parameters);
request.executeAsync() ;
}
5.7 企业账号需要注意的事项,把发布按钮打开

6、对facebookSDk 进行二次封装
package com.pegasus.map.presentation.utils; import android.app.Activity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.widget.Toast; import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.Profile;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult; import org.json.JSONObject; import java.util.Arrays;
import java.util.Collections;
import java.util.List; /**
* Created by ${zyj} on 2016/3/30.
*/
public class FaceBookLogin { private Activity activity ;
private CallbackManager callbackManager ;
private FacebookListener facebookListener ;
private List<String> permissions = Collections.<String>emptyList();
private LoginManager loginManager; public FaceBookLogin( Activity activity ){
this.activity = activity ; //初始化facebook登录服务
callbackManager = CallbackManager.Factory.create() ;
getLoginManager().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// login success
AccessToken accessToken = loginResult.getAccessToken();
getLoginInfo(accessToken);
} @Override
public void onCancel() {
//取消登录
} @Override
public void onError(FacebookException error) {
//登录出错
}
}); permissions = Arrays
.asList("email", "user_likes", "user_status", "user_photos", "user_birthday", "public_profile", "user_friends") ;
} /**
* 登录
*/
public void login(){
getLoginManager().logInWithReadPermissions(
activity, permissions);
} /**
* 退出
*/
public void logout(){
String logout = activity.getResources().getString(
com.facebook.R.string.com_facebook_loginview_log_out_action);
String cancel = activity.getResources().getString(
com.facebook.R.string.com_facebook_loginview_cancel_action);
String message;
Profile profile = Profile.getCurrentProfile();
if (profile != null && profile.getName() != null) {
message = String.format(
activity.getResources().getString(
com.facebook.R.string.com_facebook_loginview_logged_in_as),
profile.getName());
} else {
message = activity.getResources().getString(
com.facebook.R.string.com_facebook_loginview_logged_in_using_facebook);
}
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setMessage(message)
.setCancelable(true)
.setPositiveButton(logout, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
getLoginManager().logOut();
}
})
.setNegativeButton(cancel, null);
builder.create().show();
} /**
* 获取登录信息
* @param accessToken
*/
public void getLoginInfo( AccessToken accessToken ){
GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
if (object != null) {
String id = object.optString("id"); //比如:1565455221565
String name = object.optString("name"); //比如:Zhang San
String gender = object.optString("gender"); //性别:比如 male (男) female (女)
String emali = object.optString("email"); //邮箱:比如:56236545@qq.com //获取用户头像
JSONObject object_pic = object.optJSONObject("picture");
JSONObject object_data = object_pic.optJSONObject("data");
String photo = object_data.optString("url"); //获取地域信息
String locale = object.optString("locale"); //zh_CN 代表中文简体 Toast.makeText(activity, "" + object.toString(), Toast.LENGTH_SHORT).show();
}
}
}) ; Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link,gender,birthday,email,picture,locale,updated_time,timezone,age_range,first_name,last_name");
request.setParameters(parameters);
request.executeAsync() ;
} /**
* 获取loginMananger
* @return
*/
private LoginManager getLoginManager() {
if (loginManager == null) {
loginManager = LoginManager.getInstance();
}
return loginManager;
} public CallbackManager getCallbackManager(){
return callbackManager ;
} /**
* 设置登录简体器
* @param facebookListener
*/
public void setFacebookListener( FacebookListener facebookListener ){
this.facebookListener =facebookListener ;
} public interface FacebookListener {
void facebookLoginSuccess();
void facebookLoginFail() ;
} }
在 activity 使用
//初始化Facebook登录服务
FaceBookLogin faceBookLogin = new FaceBookLogin( this ) ; //登录
faceBookLogin.login(); //退出
faceBookLogin.logout();
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); //facebook回调
faceBookLogin.getCallbackManager().onActivityResult(requestCode, resultCode, data); }
最新更新(2020/4/16)
最近有机会又接触到海外项目,刚好要做 facebook 登陆功能,下面我把封装的代码用 Kotlin 实现一遍:
FacebookLoginUtil 工具类
package com.enjoy.literaturemodule.account.login.facebook import android.app.Activity
import android.content.DialogInterface
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import com.facebook.*
import com.facebook.AccessToken
import com.facebook.login.LoginManager
import com.facebook.login.LoginResult
import org.json.JSONObject /**
* @author yanjun.zhao
* @time 2020/3/10 2:35 PM
* @desc
*/
class FacebookLoginUtil(private var activity: Activity) { private var loginManager: LoginManager? = null
private val permissions: List<String>
private var callbackManager: CallbackManager? = null init {
//初始化facebook登录服务
callbackManager = CallbackManager.Factory.create()
getLoginManager()?.registerCallback(callbackManager, object : FacebookCallback<LoginResult> {
override fun onSuccess(result: LoginResult?) {
getLoginInfo(result?.accessToken)
} override fun onCancel() {
} override fun onError(error: FacebookException?) {
}
})
permissions = listOf("email", "user_likes", "user_status", "user_photos", "user_birthday", "public_profile", "user_friends");
} /**
* 登陆
*/
fun login() {
getLoginManager().logInWithReadPermissions(activity, permissions)
} /**
* 退出登陆
*/
fun loginOut() {
var logout = activity.resources.getString(com.facebook.R.string.com_facebook_loginview_log_out_action)
var cancel = activity.resources.getString(com.facebook.R.string.com_facebook_loginview_cancel_action)
val message: String
val profile: Profile = Profile.getCurrentProfile()
message = if (profile?.name != null) {
java.lang.String.format(
activity.resources.getString(
R.string.com_facebook_loginview_logged_in_as),
profile.name)
} else {
activity.resources.getString(
R.string.com_facebook_loginview_logged_in_using_facebook)
}
val builder: AlertDialog.Builder = AlertDialog.Builder(activity)
builder.setMessage(message)
.setCancelable(true)
.setPositiveButton(logout, DialogInterface.OnClickListener { dialog, which ->
getLoginManager().logOut()
})
.setNegativeButton(cancel, null)
builder.create().show()
} /**
* 获取登录信息
* @param accessToken
*/
private fun getLoginInfo(accessToken: AccessToken?) {
var request = GraphRequest.newMeRequest(accessToken, object : GraphRequest.GraphJSONObjectCallback {
override fun onCompleted(`object`: JSONObject?, response: GraphResponse?) { `object`?.run {
val id = optString("id") //比如:1565455221565
val name = optString("name") //比如:Zhang San
val gender = optString("gender") //性别:比如 male (男) female (女)
val emali = optString("email") //邮箱:比如:56236545@qq.com
//获取用户头像
val object_pic = optJSONObject("picture")
val object_data = object_pic.optJSONObject("data")
val photo = object_data.optString("url")
//获取地域信息
val locale = optString("locale") //zh_CN 代表中文简体 }
}
})
val parameters = Bundle()
parameters.putString("fields", "id,name,link,gender,birthday,email,picture,locale,updated_time,timezone,age_range,first_name,last_name")
request.parameters = parameters
request.executeAsync()
} fun getCallbackManager(): CallbackManager? {
return callbackManager
} /**
* 获取loginMananger
* @return
*/
private fun getLoginManager(): LoginManager {
if (loginManager == null) {
loginManager = LoginManager.getInstance();
}
return loginManager!!
} companion object { /**
* 是否处在登陆状态
*/
fun isLogin(): Boolean {
val accessToken = AccessToken.getCurrentAccessToken()
val isLoggedIn = accessToken != null && !accessToken.isExpired
return isLogin()
}
}
}
Activity 使用示范
package com.enjoy.literaturemodule.account import android.app.Activity
import android.content.Intent
import android.os.Bundle
import com.enjoy.literaturemodule.R
import com.enjoy.literaturemodule.account.login.facebook.FacebookLoginUtil
import kotlinx.android.synthetic.main.activity_login.* /**
* 登陆
*/
class LoginActivity : Activity() { private var faceBookUtil: FacebookLoginUtil? = null override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
faceBookUtil = FacebookLoginUtil(this) facebook_login?.setOnClickListener {
faceBookUtil?.login()
}
} override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
//facebook 登陆
//facebook回调
faceBookUtil?.getCallbackManager()?.onActivityResult(requestCode, resultCode, data)
super.onActivityResult(requestCode, resultCode, data)
}
}
Android 应用程序集成FaceBook 登录及二次封装的更多相关文章
- Android 应用程序集成Google 登录及二次封装
谷歌登录API: https://developers.google.com/identity/sign-in/android/ 1.注册并且登录google网站 https://accounts. ...
- android应用集成facebook登录
之前都是做国内的应用开发,没有用过国外的三方登录,比如谷歌登录.facebok登录,最近参与了一个海外的支付相关的项目,调研了一下谷歌登录和facebook登录,其实调研之后觉得也是很简单的,尤其 ...
- 在Android上实现使用Facebook登录(基于Facebook SDK 3.5)
准备工作: 1. Facebook帐号,国内开发者需要一个vpn帐号(网页可以浏览,手机可以访问) 2. 使用Facebook的SDK做应用需要一个Key Hashes值. 2 ...
- 在Android App中集成Google登录
技术文章 来源:码农网 发布:2016-09-19 浏览:194 摘要:今天,几乎所有的web和移动app都自带谷歌和Facebook登录,这对app开发者和用户来说是一个非常有用的功能,因为几乎每个 ...
- Android 学习笔记之AndBase框架学习(二) 使用封装好的进度框,Toast框,弹出框,确认框...
PS:渐渐明白,在实验室呆三年都不如在企业呆一年... 学习内容: 1.使用AbActivity内部封装的方法实现进度框,Toast框,弹出框,确认框... AndBase中AbActivity封 ...
- Android 版 Facebook 登录
Android 版 Facebook SDK 让用户可以通过 Facebook 登录注册您的应用.通过 Facebook 登录您的应用时,用户可以向应用授予权限,以便您可以检索信息或以用户的身份在 F ...
- Android平台接入Facebook登录
官方教程地址: https://developers.facebook.com/docs/android/getting-started 开发环境为Android Studio,官方要求SDK最低版本 ...
- 社会化登录分享-Android SDK的二次封装和使用
本系列文章将第三方的登录分享功能进行二次封装,统一接口调用,简化了接不同平台登录分享的步骤. 0 系列文章 系列一 Android SDK的二次封装和使用 系列二 源码解析 系列三 微信SDK接入 系 ...
- 利用本地HTTPS模拟环境为FastAPI框架集成FaceBook社交三方登录
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_174 提起社交,就不得不说马克·扎克伯格(Mark Zuckerberg)一手创办的社交网络(FaceBook).进入2020年, ...
随机推荐
- MongoDB学习系列(2)--使用PHP访问MongoDB
第一部分:介绍 在Windows上安装最新MongoDB步骤非常的简单,这里不做介绍.但是如果你安装的时候没有将MongoDB作为服务运行,每次你都要使用cmd切换到指定的目录下,然后在cmd中启动M ...
- iOS开发之多图片无缝滚动组件封装与使用
经常有园友会问"博主,有没有图片无限滚动的Demo呀?", 正儿八经的图片滚动的Demo我这儿还真没有,今天呢就封装一个可以在项目中直接使用的图片轮播.没看过其他iOS图片无限轮播 ...
- MySQL数据库实例参数对比脚本
如何对比两个MySQL实例的参数情况,生产中常会有这样的需求,最近写了个python脚本,可基本实现该需求. 脚本 #!/usr/bin/python import MySQLdb,sys def f ...
- 输入URL到展现页面的全过程
最近在看一本关于网络协议的书<图解HTTP> 当我们在浏览器的地址栏输入 http://www.pwstrick.com ,然后回车,回车这一瞬间到看到页面到底发生了什么呢? 1. 域名 ...
- ng1和ng2的部分对比----angular2系列(四)
前言: angular2相比angular1做了革命性的改变.对于开发者来说,我们知道它框架的实现上改变极大.我们看到代码也能发现它写法上变化很大,似乎完全是另一个东西. 但是当我们真正去写下去的时候 ...
- Asp.Net 使用Npoi导出Excel
引言 使用Npoi导出Excel 服务器可以不装任何office组件,昨天在做一个导出时用到Npoi导出Excel,而且所导Excel也符合规范,打开时不会有任何文件损坏之类的提示.但是在做导入时还是 ...
- SQL Server 执行计划利用统计信息对数据行的预估原理以及SQL Server 2014中预估策略的改变
前提 本文仅讨论SQL Server查询时, 对于非复合统计信息,也即每个字段的统计信息只包含当前列的数据分布的情况下, 在用多个字段进行组合查询的时候,如何根据统计信息去预估行数的. 利用不同字段 ...
- SQL Server安全(11/11):审核(Auditing)
在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...
- UWP开发入门(二十二)——Storyboard和Animation
微博上有同学问我MyerSplash是如何实现那个很炫的图片点亮,然后移动到屏幕中央的效果.惭愧啊,我又不是作者哪里会知道.硬着头皮去GitHub拜读了高手的代码,自愧弗如,比我不知道高到哪里去了…… ...
- 40 个让你的网站更加友好的 jQuery 插件
一个插件的基本功能是执行一个含有元素集合的函数数组.每个方法和jQuery核心组成一个插件,如.fadeOut()或.addClass().一个jQuery插件是一个基本的可以扩充jQuery 原型对 ...