Android集成Firebase实现Facebook登录时提示权限未获用户批准
问题修复步骤
- 修复callbackManager变量遮蔽问题
你在类顶部声明了全局callbackManager,但在onCreate中又用val关键字创建了同名局部变量,导致回调实际绑定到了局部变量,生命周期结束后就失效,无法正确接收登录结果。
修改onCreate中的初始化代码,去掉val关键字:
// 修改前:val callbackManager = CallbackManager.Factory.create() // 修改后: callbackManager = CallbackManager.Factory.create()
- 添加Facebook客户端token配置
日志明确提示v13及以上版本的Facebook SDK必须配置客户端token才能正常调用Graph API,你需要在AndroidManifest.xml的application节点下添加如下配置:
<meta-data android:name="com.facebook.sdk.ClientToken" android:value="你的Facebook应用客户端token" />
客户端token可在Facebook开发者后台对应应用的「设置-基本」页面获取。
- 补全Android 11+包可见性声明
如果你的应用targetSdkVersion>=30,需要在AndroidManifest.xml的根节点(和application节点平级)添加包可见性配置,否则无法调起Facebook客户端:
<queries> <package android:name="com.facebook.katana" /> <package android:name="com.facebook.orca" /> <package android:name="com.example.facebook" /> </queries>
- 消除事件收集警告(可选)
如果不需要Facebook的自动事件统计和广告ID收集功能,可以在AndroidManifest.xml的application节点下添加如下配置消除相关警告:
<meta-data android:name="com.facebook.sdk.AutoLogAppEventsEnabled" android:value="false" /> <meta-data android:name="com.facebook.sdk.AdvertiserIDCollectionEnabled" android:value="false" />
如果需要使用相关功能,将value改为true即可。
移除重复权限配置
你已经给LoginButton设置了读取权限,后续又给LoginManager单独设置了一次相同权限,重复配置可能导致逻辑冲突,保留其中一处即可:要么直接使用LoginButton自带的点击登录逻辑,删除自定义的点击事件;要么不用LoginButton的默认逻辑,完全通过LoginManager触发登录。补充onActivityResult回调分发
你需要在Activity中重写onActivityResult方法,将登录结果传递给callbackManager,否则无法触发登录成功/失败的回调:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { callbackManager.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data) }
如果项目使用了AndroidX的Activity Result API,可以改用Facebook提供的新API注册回调,不需要重写该方法,同时可以消除对应的日志警告。
所有配置修改完成后,先卸载模拟器上的旧应用再重新安装测试,避免缓存的登录状态影响验证结果。
内容的提问来源于stack exchange,提问作者zain mahmood
相关产品推荐
相关产品推荐

