1.添加依赖
在对应 Module 的 build.gradle 文件下添加以下代码:
implementation 'com.facebook.android:facebook-login:[5,6)'
2.配置资源和清单
1.在 strings.xml 文件中添加如下配置:
<string name="facebook_app_id">[APP_ID]</string>
<string name="fb_login_protocol_scheme">fb[APP_ID]</string>
2.在 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: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>
3.添加集成代码
1.在 onCreate() 或 onCreateView() 方法中对facebook SDK进行初始化并注册回调 代码如下:
/**
* 初始化Facebook
*/
private fun initFacebook(){
callbackManager = CallbackManager.Factory.create()
if (Constants.DEBUG) {
//打印facebook 识别应用的 key
KLog.e("facebook key=${FacebookSdk.getApplicationSignature(this)}")
}
//添加回调
LoginManager.getInstance().registerCallback(callbackManager,
object : FacebookCallback<LoginResult> {
override fun onSuccess(loginResult: LoginResult) {
// App code
KLog.e("login", "token: " + loginResult.accessToken.token)
val code = loginResult.accessToken.token
//调用后台接口进行登录
viewModel?.facebookLogin(code)
}
override fun onCancel() {
// App code
}
override fun onError(exception: FacebookException) {
// App code
KLog.e("login", "e: $exception")
}
})
}
2.在 onActivityResult() 方法中调用 callbackManager.onActivityResult() 将登录结果传递给 LoginManager , 代码如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Facebook 登录结果传递给LoginManager
callbackManager.onActivityResult(requestCode, resultCode, data);
}
3.调用Facebook SDK进行登录,代码如下:
/**
* 调用facebook 登录
*/
private fun toFacebook(){
val accessToken = AccessToken.getCurrentAccessToken()
val isLoggedIn = accessToken != null && !accessToken.isExpired
if (isLoggedIn) {
//判断Facebook是否登录 如果登录先退出
try {
LoginManager.getInstance().logOut()
AccessToken.setCurrentAccessToken(null)
} catch (e: Exception) {
e.printStackTrace()
}
}
//调用facebook登录
LoginManager.getInstance().logInWithReadPermissions(
this,
listOf("public_profile", "email", "user_friends")
)
}
5.由于一般情况下我们只是需要Facebook 返回的token识别用户,所以在退出该页面时在__onDestroy()__调用Facebook的退出API,代码如下:
/**
* 退出Facebook登录
*/
private fun outFacebook(){
//退出facebook
val accessToken = AccessToken.getCurrentAccessToken()
val isLoggedIn = accessToken != null && !accessToken.isExpired
if (isLoggedIn) {
//判断Facebook是否登录 如果登录先退出
try {
LoginManager.getInstance().logOut()
AccessToken.setCurrentAccessToken(null)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
注意:
虽然在一般情况下使用Facebook登录就会显示 facebook 识别应用的key,但是有些情况下会出现直接通过登录而不会显示key,这个时候我们可以调用 Facebook 的API进行获取,代码如下:
FacebookSdk.getApplicationSignature(context)
到这里就集成完毕了