给APP用原生android进行facebook第三方登录。

我们做一件事情,首先得了解其原理,这样才不会迷茫,才知道自己做到什么程度了,心里才会有底。

所以,第一步,了解第三方登录的原理:下面贴一些帮助我们理解的图,无论什么形式,自己理解了就好了

http://blog.csdn.net/Yester_Sun/article/details/52353604    (可以参考)

http://www.jikexueyuan.com/course/1742_1.html?ss=2   (教程视频)

● 获取code值:https://www.facebook.com/dialog/oauth?client_id=应用编号&redirect_uri=回调地址&code=,这时在地址栏上会出现一长串code
● 获取access_token:https://graph.facebook.com/oauth/access_token?client_id=应用编号&redirect_uri=回调地址&client_secret=应用密钥&code=刚才获取到的code
● 获取用户资料:https://graph.facebook.com/me?access_token=刚才获取到的access_token,得到用户的id和name

第二步,第三方登录开发的流程:

1.注册一个facebook平台账号,需要翻墙。这个用我们平时的登录账号就可以。

2.申请成为开发者。

3.创建应用。主要获取appId 和 appSecret

4.设置回调的url。

5.开发 & 测试

快速启动 选择平台-android ,有我们需要的开发的步骤,大家自己进入官网进行操作。

*******************************************************************************************
 

其中有几点需要注意:(  这些是我在做的时候,花了好久才搞明白的问题。)

  • 添加keyhash:当你在用手机测试的时候如果手机装了FaceBook是登录出错的,测试的时候用的是debug.apk,注册应用时keyhash配置的release.apk,他们keyhash值不一样,测试只能网页登录。

意思是  如果我们用debug.apk,keyhash也要用debug的,用release.apk,kehash也要用release的。

添加keyhash---让facebook分辨你的app是不是当初设定的那个app,要符合才对facebook进行存取。

release版本的keyhash: http://blog.csdn.net/u010838555/article/details/39851863  前提是安装openssl,此链接里面有安装步骤。

C:\Users\lemon>keytool -exportcert -alias 'key' -keystore E:\test\as_key.jks |C:\openssl\bin\openssl.exe sha1 -binary | C:\openssl\bin\openssl.exe base64

debug版本的keyhash:

C:\Users\lemon>keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | C:\openssl\bin\openssl.exe sha1 -binary |C:\openssl\bin\openssl.exe base64

注意:  -keystore 后边是自己的debug.keystore的路径;openssl.exe也是自己安装的路径,密码都是 android.

**************************************************************************************************

  • 单点登录 SSO : 参考http://wiki.mob.com/single-sign-on-sso/

    新浪微博、腾讯微博、QQ空间、人人网、Facebook和Dropbox已经提供了Single Sign-On(SSO)的授权方式。就是利用这些平台的手机客户端来完成授权。由于SSO的授权方式对于用户来说更加便捷,因此各大平台均建议开发者优先使用这一种授权方式。ShareSDK提供SSO的授权实现,并且默认情况下是使用的。但是如果您想关闭SSO功能,可以调用类似于下面的代码来关闭:

    Platform facebook = ShareSDK.getPlatform(Facebook.NAME);
    facebook.SSOSetting(true); // true表示不使用SSO方式授权
    facebook.setPlatformActionListener(paListener);
    facebook.authorize();

    为方法SSOSetting传递参数true,表示不使用SSO方式授权。

keyhash 是开启SSO授权的时候才需要填的选项,facebook审核需要开启sso授权才可以通过。

**********************************************************************************************************************

  1. LoginManager-初始化登陆进程并请求权限
  2. LoginButton-这个组件包装在LoginManager,当点击这个button的时候,登陆进程就会初始化(拥有了权限),同时,button会跟踪登陆状态,并根据用户的登录状态展示对应的文档信息。
  3. CallbackManager-用于回掉FaceBookSDK并注册你的回掉,你应该在你的初始化Activity或者fragment的OnActivityResult中回掉。
  4. Access Token-使用此类图形的API请求,它展示了 user id,以及拒绝和接收的权限
  5. Profile-这个类拥有登陆用户的基本信息

**********************************************************************************************************************

在实际的项目开发中,  不会只是登录成功就完事了,还会将登陆成功之后,facebook返回给我们的唯一的id号注册到我们的后台,我是这样做的:

在清单文件中:

<meta-data android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id"/>
<activity android:name="com.facebook.FacebookActivity"
android:exported="true"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name" />

在布局文件中:

<!--faceook登录官网的按钮-->
 <com.facebook.login.widget.LoginButton
android:id="@+id/login_facebookbutton"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp"
android:textSize="@dimen/text_size_5" />
有时候我们不需要官网提供给我们的按钮,需要自定义
<!--faceook登录的自定义按钮-->
 <Button
android:id="@+id/login_facebookbutton"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="2dp"
android:text="facebook登录"
android:textColor="@color/white"
android:textStyle="bold"
/>

在activity中:

private CallbackManager callbackManager;

 @Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_login1);
FacebookSdk.sdkInitialize(getApplicationContext(),10000);//10000-RequestCode
//注册callback
callbackManager = CallbackManager.Factory.create();
//官网定义fb按钮的做法
LoginButton loginButton = (LoginButton) findViewById(R.id.login_facebookbutton);
loginButton.setReadPermissions(Arrays.asList("public_profile", "email", "user_friends"));
loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { //用户自定义fb按钮的做法
        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
//为了响应登录结果,您需要使用 LoginButton 注册回调.
//如果登录成功,LoginResult 参数将拥有新的 AccessToken 及最新授予或拒绝的权限。
@Override
public void onSuccess(final LoginResult loginResult) { GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
if (object != null) {
email = object.optString("email");
firstname = object.optString("first_name");
lastname = object.optString("last_name");
Log.e("log", "LoginActivity - email----" + email);
Log.e("log", "LoginActivity - getLoginInfo::---" + object.toString()); AccessToken accessToken = loginResult.getAccessToken();
fbuserId = accessToken.getUserId();
String token = accessToken.getToken();
Log.e("log", "LoginActivity - accessToken:::" + accessToken);
Log.e("log", "LoginActivity - userid:::" + fbuserId); if (accessToken != null) {
//如果登录成功,跳转到登录成功界面,拿到facebook返回的email/userid等值,在我们后台进行操作 // FbLogin();
}
}
}
}); 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();
} @Override
public void onCancel() {
// Toast.makeText(LoginActivity.this, "facebook_account_oauth_Cancel", Toast.LENGTH_SHORT).show();
} @Override
public void onError(FacebookException e) {
// Toast.makeText(LoginActivity.this, "facebook_account_oauth_Error", Toast.LENGTH_SHORT).show(); }
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) { case 10000:
if (callbackManager != null) {
//在用户成功授权之后,回调onActivityResult(),需要重写 onActivityResult()
callbackManager.onActivityResult(requestCode, resultCode, data);
}
break;
} //自定义fb按钮,在你代码的正确地方
btn_fb = (Button) findViewById(R.id.login_facebookbutton);
btn_fb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LoginManager.getInstance()
.logInWithReadPermissions(LoginActivity.this,
Arrays.asList("public_profile", "user_friends","email"));
}
});
}

代码在项目已用,可用。

 

android开发学习——facebook第三方登录,看了你不会后悔的更多相关文章

  1. java网站如何集成facebook第三方登录

    第一次接触Facebook第三方登录,可能有些地方做的并不全面,只是尝试着做了一个小demo,因为国内接入Facebook的项目并不多,并且多数都是Android或iOS的实现,所以资料也特别少,在此 ...

  2. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  3. Android开发学习总结(一)——搭建最新版本的Android开发环境

    Android开发学习总结(一)——搭建最新版本的Android开发环境(转) 最近由于工作中要负责开发一款Android的App,之前都是做JavaWeb的开发,Android开发虽然有所了解,但是 ...

  4. 最实用的Android开发学习路线分享

    Android开发学习路线分享.Android发展主导移动互联发展进程,在热门行业来说,Android开发堪称火爆,但是,虽然Android有着自身种种优势,但对开发者的专业性要求也是极高,这种要求随 ...

  5. Android开发学习必备的java知识

    Android开发学习必备的java知识本讲内容:对象.标识符.关键字.变量.常量.字面值.基本数据类型.整数.浮点数.布尔型.字符型.赋值.注释 Java作为一门语言,必然有他的语法规则.学习编程语 ...

  6. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

  7. Android开发学习之路--Android Studio cmake编译ffmpeg

      最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...

  8. Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...

  9. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

随机推荐

  1. SQL2012 尝试读取或写入受保护的内存。这通常指示其它内存已损坏

    今天打开SQL2012,突然就连接不了数据库.一開始还以为是某个server崩溃了.结果试了好几个.都还是如此,弹出提演示样例如以下: 尝试读取或写入受保护的内存.这通常仅仅是其它内存已损坏.(Sys ...

  2. debug找到source lookup path以及,debug跑到另外的解决办法

    在我们使用eclipse调试的时候,有时候会出一些奇葩的问题,比如找不到Source  lookup path, 这时我们可以点击Edit Source Lookup Path.接着回弹出一个 我们只 ...

  3. javascript闭包的应用

    我印象中,javascript的闭包属于进阶的范畴,无非是用来在面试中装装逼而已.你看我身边的一个小伙子,有一天我装逼地问他什么是javascript的闭包,他居然连听都没听说过.但他做起前端的东西来 ...

  4. npm, webpack, vue-cli, vue-x, axios

    1,什么是node.js,以及npm 简单的来说Node.js就是运行在服务端的JavaScript,是基于Chrome V8引擎的.npm是Node.js包的管理工具. 2,npm的安装和更新 No ...

  5. LeetCode 1.两数之和(JS)

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  6. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE【转】

    本文转载自:http://www.cnblogs.com/52php/p/5681745.html 前言: 开发了5,6年的时间,如果没有KDE4,也许不会有人或者Linux发行版本重视cmake,因 ...

  7. html5--html实现乘法口诀表

    html5--html实现乘法口诀表 总结: 1.多种情况问题:分情况讨论就出来了 2.汉字和数字的对应关系 3.相同的部分统一处理,不同的部分分别对待(这里用中间变量) 问题:九九乘法口诀 两点提示 ...

  8. Persisting Data to the Device

    Persisting Data to the Device Edit PagePage History Overview The Android framework offers several op ...

  9. FLASH OTP

    OTP 软件加密运用参考 为了防止软件被他人盗用,spansion flash给每个芯片植入了代表身份的unique ID,增加了OTP扇区,目前我们可以运用这两个特性,来实现软件的加密保护.软件加密 ...

  10. ChartCtrl源码剖析之——CChartLegend类

    CChartLegend类用来绘制每一个波形的描述信息,它处于该控件的区域,如下图所示: CChartLegend类的头文件. #if !defined(AFX_CHARTLEGEND_H__CD72 ...