给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. 自定义UICollectinviewFlowLayout,即实现瀑布流

    如图所示,通过实现不规则的网格分布,来显示出不同的效果.因为集合视图必须要指定布局还可以显示,所以自定义布局就可以实现瀑布流的效果. //创建布局对象 WaterFlowLayout *flowLay ...

  2. nova分析(7)—— nova-scheduler

    Nova-Scheduler主要完成虚拟机实例的调度分配任务,创建虚拟机时,虚拟机该调度到哪台物理机上,迁移时若没有指定主机,也需要经过scheduler.资源调度是云平台中的一个很关键问题,如何做到 ...

  3. Mac OS X Yosemite 10.10 配置 Apache+PHP 教程注意事项

    刚更新到了 Mac OS X Yosemite 10.10,发现运行Apache出现了一些问题,修正一下! 教程基于 Mac OS X Mavericks 10.9.X,移步:Mac OS X Mav ...

  4. oc 怎么接收NSSting字符的方法

    ]; //使用一个缓冲区 NSLog(@"请输入一个字符串:"); scanf("%s",buffer); NSString * str = [NSString ...

  5. 抽象工厂模式(Java与Kotlin版)

    前文推送 设计模式 简单工厂模式(Java与Kotlin版) 工厂方法模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操 ...

  6. python基础之文件操作和函数

    一.知识点 1.三元运算 a = 2 b = 3 val = 6 if a < b else 7 print(val) 2.文件读取 f = open(file='file.txt',mode= ...

  7. 深入理解Java虚拟机读书笔记5----虚拟机字节码执行引擎

    五 虚拟机字节码执行引擎   1 运行时栈帧结构     ---栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素.     ---栈帧中存储了方法的局部变 ...

  8. ubuntu 下 rvm 卸载和重装

    卸载: sudo apt-get --purge remove ruby-rvm sudo rm -rf /usr/share/ruby-rvm /etc/rvmrc /etc/profile.d/r ...

  9. Kafka基本操作

    cd kafka_2.11-0.11.0.1 bin/zookeeper-server-start.sh config/zookeeper.properties bin/kafka-server-st ...

  10. java自定义事件机制分析

    import java.util.ArrayList; import java.util.EventListener; import java.util.EventObject; import jav ...