android - 如何在不推荐使用 onActivityResult 的情况下使用 Facebook 登录 CallbackManager?
问题描述
我正在使用 Facebook 登录选项创建应用程序。到目前为止,我做了所有事情,但是从 Facebook 应用程序之后的结果出现了问题。我遵循了 Google 的文档,但该文档没有使用新弃用的 onActivityResult 函数进行更新。现在,我已经使用了从this获取另一个活动结果的新方法。但是,由于不使用 registerForActivityResult 启动器,这不适用于 Facebook 登录实现,但它使用自己的回调管理器。
有没有人想出解决这个问题的方法?也许我错过了一些东西。
callbackManager = CallbackManager.Factory.create()
signInWithFacebook.setReadPermissions("email", "public_profile")
signInWithFacebook.registerCallback(
callbackManager,
object : FacebookCallback<LoginResult> {
override fun onSuccess(result: LoginResult) {
handleFacebookAccessToken(result.accessToken)
}
override fun onCancel() {
}
override fun onError(error: FacebookException?) {
}
})
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
callbackManager.onActivityResult(requestCode, resultCode, data)
}
private fun handleFacebookAccessToken(token: AccessToken) {
val credential = FacebookAuthProvider.getCredential(token.token)
auth.signInWithCredential(credential)
.addOnCompleteListener(OnCompleteListener {
if (it.isSuccessful) {
} else {
}
})
}
解决方案
使用这个(https://github.com/facebook/facebook-android-sdk/issues/875)Github问题我找到了你的答案,这里是总结
首先,初始化回调管理器
val callbackManager: CallbackManager = CallbackManager.Factory.create()
然后使用登录管理器注册回调
LoginManager.getInstance().registerCallback(callbackManager,
object : FacebookCallback<LoginResult?> {
override fun onSuccess(result: LoginResult?) {
if (result?.accessToken != null) {
val accessToken = result.accessToken.token
}
}
override fun onCancel() {
}
override fun onError(error: FacebookException) {
}
})
在您的自定义 Facebook 按钮上,您必须 setOnClickListner
binding.btnFacebook.setOnClickListener {
LoginManager.getInstance().logInWithReadPermissions(
this,
loginViewModel.callbackManager,
listOf("public_profile", "email")
)
}
我们必须为 onActivityResult 更改的内容已弃用
之前
binding.btnFacebook.setOnClickListener {
LoginManager.getInstance().logInWithReadPermissions(
this,
listOf("public_profile", "email")
)
}
现在
binding.btnFacebook.setOnClickListener {
LoginManager.getInstance().logInWithReadPermissions(
this,
loginViewModel.callbackManager, //we added callback here according to new sdk 12.0.0 version of facebook
listOf("public_profile", "email")
)
}
现在我正在使用 Facebook SDK 版本
//facebook login
implementation 'com.facebook.android:facebook-login:12.0.0'
推荐阅读
- performance - 如何加快这个 haskell lastDigits xy 函数?
- reactjs - 如何在点击按钮时创建一个 div?
- java - 如何使用 for 循环搜索此数组列表。并检查它是否包含元素 x
- javascript - Angular Chart.JS 只有一个画布渲染
- angular - Angular ActivatedRoute 订阅未在路由更改时触发
- terraform - Terraform azurerm 自定义 rbac 角色在角色分配时出现连接错误
- reactjs - 刷新页面时基于API调用的React Hooks PrivateRoute不起作用
- javascript - MongoDB / Axios / React.js:无法读取未定义的属性“id”
- google-sheets - 滚动 AVERAGEIF 公式的数组公式?
- pyqt - PyQt 线程完成并输出相同的消息两次