Facebook三方登录,是用于获取Facebook账号的基本信息,如头像、别名、手机号码等,通过获取到的信息去自身平台注册对应账号,方便用户的注册。
[TOC]
集成准备
1.创建Facebook应用
2.应用配置信息
功能实现
1.配置仓库
// project/bulid.gradle:
allprojects {
repositories {
jcenter()
}
}
// app/bulid.gradle:
implementation 'com.facebook.android:facebook-login:[5,6)'
2.清单文件和资源
//网络权限
<uses-permission android:name="android.permission.INTERNET"/>
//配置facebookId,可查看应用id填写
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />
//配置对应的FacebookActivity,用于登录跳转Facebook应用
<activity
android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name" />
//配置无安装Facebook时,网页跳转界面
<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>
//资源文件中进行配置
<string name="facebook_app_id">299548570997514</string>
<string name="fb_login_protocol_scheme">fb299548570997514</string>
3.获取散列密钥并配置
工具类地址:https://code.google.com/archive/p/openssl-for-windows/downloads
keytool -exportcert -alias name(key的别名) -keystore C:\Users\Administrator\Desktop\key\key_name.jks(key的实际路径) |
E:\download\openssl-0.9.8k_X64\bin\openssl(工具的绝对路径) sha1 -binary |
E:\download\openssl-0.9.8k_X64\bin\openssl base64
//命令执行成功以后会要求输入密码,最终生成32位的随机码,需要把这些随机码作为散列密钥配置到Facebook中
//用于配置debug的时候,也使用签名key进行应用签名
signingConfigs {
release {
v2SigningEnabled true
}
debug {
//别名
keyAlias 'name'
//key密码
keyPassword 'pw123'
//key路径
storeFile file('F:\\name.jks')
//本机密码
storePassword 'storepw123'
}
}
4.代码实现
Application
FacebookSdk.sdkInitialize(getApplicationContext());
Actvitity
//在Activity的onCreate时对CallbackManager进行初始化
CallbackManager mCallbackManager = CallbackManager.Factory.create();
//设置对应的回调监听
LoginManager.getInstance().registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
LogUtil.d(TAG,"onSuccess-------------");
showLoading(true);
//成功以后去获取对应的Facebook账号信息
getFacebookInfo(loginResult.getAccessToken());
}
@Override
public void onCancel() {
// App code
LogUtil.d(TAG,"onCancel-------------");
}
@Override
public void onError(FacebookException exception) {
LogUtil.d(TAG, exception.toString());
//如果是因为Facebook本身的鉴权问题,同时获取到token,则需要主动登出,防止重试无法登录
if (exception instanceof FacebookAuthorizationException) {
if (AccessToken.getCurrentAccessToken() != null) {
LoginManager.getInstance().logOut();
}
}
}
});
//配置回调,所有回调信息都会在mCallbackManager中
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mCallbackManager.onActivityResult(requestCode, resultCode, data);
}
//登录按钮点击事件调用代码
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile"));
//获取Facebook用户信息,根据key值去获取,再执行平台的登录操作
public void getFacebookInfo(AccessToken accessToken) {
GraphRequest.newMeRequest(accessToken, (object, response) -> {
if (object != null) {
thirdPartyNickName = object.optString("name");
thirdPartyUserName = object.optString("id");
//go Login
...
}else {
//fail
showLoading(false);
XMToastUtil.showShortToast(PadLoginActivity.this, getString(R.string.dialog_login_facebook_fail));
}
}).executeAsync();
}
功能校验
1.集成校验
如果点击登录按钮,Facebook应用或者网页有对应的加载框,并含有Facebook的logo图标,代码代码集成是没问题的。
2.整体校验
若遇到无法登录的情况,那必然是密钥的配置存在问题,密钥库请使用最新的库,并且校验使用的key值是否为正式key,debug调试配置的key是否也是一致的。有的手机配置错误会提示密钥散列库中不匹配,同时会把需要配置的密钥显示出来。如若key的配置是正确的,那么可以在log日志中查看到对应的错误提示。