You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:00:58