Android集成Facebook登录与Firebase Database,求助MyApplication正确用法
解决方案: 集成Facebook登录与Firebase Database
1. 正确配置MyApplication类
首先需在AndroidManifest.xml中注册自定义Application类,确保应用启动时加载它:
<application android:name=".MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.FacebookAuthorization"> <!-- 主Activity声明 --> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- Facebook登录所需Activity --> <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> </application>
同时移除MainActivity中的FirebaseApp.initializeApp(this@MainActivity)调用,避免重复初始化引发异常。
2. 完善Facebook登录回调逻辑
补全FacebookCallback核心方法,并实现Firebase与Facebook的身份验证关联:
class MainActivity : AppCompatActivity() { private lateinit var database: FirebaseDatabase private lateinit var auth: FirebaseAuth private lateinit var callbackManager: CallbackManager private lateinit var loginButton: LoginButton @SuppressLint("MissingInflatedId") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化Firebase Database database = FirebaseDatabase.getInstance("https://facebookauthorization-422d6-default-rtdb.firebaseio.com/") auth = Firebase.auth loginButton = findViewById(R.id.login_button) callbackManager = CallbackManager.Factory.create() // 请求用户邮箱和公开资料权限 loginButton.setReadPermissions("email", "public_profile") loginButton.registerCallback(callbackManager, object : FacebookCallback<LoginResult> { override fun onSuccess(loginResult: LoginResult) { // Facebook登录成功,关联Firebase认证 handleFacebookAccessToken(loginResult.accessToken) } override fun onCancel() { Toast.makeText(this@MainActivity, "登录已取消", Toast.LENGTH_SHORT).show() } override fun onError(error: FacebookException) { Toast.makeText(this@MainActivity, "登录失败: ${error.message}", Toast.LENGTH_SHORT).show() } }) } // 处理Facebook AccessToken,完成Firebase认证 private fun handleFacebookAccessToken(token: AccessToken) { val credential = FacebookAuthProvider.getCredential(token.token) auth.signInWithCredential(credential) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { val user = auth.currentUser user?.let { Toast.makeText(this@MainActivity, "登录成功: ${it.displayName}", Toast.LENGTH_SHORT).show() // 将用户信息写入Firebase Database saveUserToDatabase(it) } } else { Toast.makeText(this@MainActivity, "认证失败: ${task.exception?.message}", Toast.LENGTH_SHORT).show() } } } // 保存用户信息到Firebase Database private fun saveUserToDatabase(user: FirebaseUser) { val userData = User( uid = user.uid, name = user.displayName ?: "", email = user.email ?: "", facebookId = user.providerData.firstOrNull { it.providerId == "facebook.com" }?.uid ?: "" ) val userRef = database.reference.child("users").child(user.uid) userRef.setValue(userData) .addOnSuccessListener { Toast.makeText(this@MainActivity, "用户信息已保存", Toast.LENGTH_SHORT).show() } .addOnFailureListener { e -> Toast.makeText(this@MainActivity, "保存失败: ${e.message}", Toast.LENGTH_SHORT).show() } } // 传递登录结果给Facebook回调管理器 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) callbackManager.onActivityResult(requestCode, resultCode, data) } } // 用户数据类,用于序列化到Firebase Database data class User( val uid: String, val name: String, val email: String, val facebookId: String )
3. 关键注意事项
- 在Firebase控制台启用Facebook登录提供器,并配置正确的Facebook应用ID和秘钥。
- 在
strings.xml添加Facebook登录协议scheme:<string name="fb_login_protocol_scheme">fb你的应用ID</string>(例如fb123456789)。 - 确保Module级
build.gradle已添加依赖:// Firebase Auth implementation 'com.google.firebase:firebase-auth-ktx:22.3.1' // Firebase Database implementation 'com.google.firebase:firebase-database-ktx:20.3.0' // Facebook SDK implementation 'com.facebook.android:facebook-login:16.2.0'
内容的提问来源于stack exchange,提问作者Javed Quantum
相关产品推荐
相关产品推荐

