Android 集成指南:Google 登录、Facebook 登录 与 Firebase 深入接入(实战)

目录

  1. 前言与总体流程

  2. 通用准备(项目、SHA、包名、OAuth)

  3. Google Sign-In 集成(控制台、依赖、Manifest、代码、Firebase 联动)

  4. Facebook Login 集成(开发者平台、依赖、Manifest、代码、Firebase 联动)

  5. Firebase 全家桶接入(项目创建、Analytics、Auth、Firestore、Realtime、Storage、FCM、Crashlytics、Remote Config)

  6. Firebase Auth:用 Google/Facebook Token 登录(示例)

  7. 推送(FCM)接入要点与示例

  8. Crashlytics / Performance / Remote Config 快速上手

  9. ProGuard / R8、权限、隐私与合规(GDPR)

  10. 调试、常见错误与排查清单

  11. 最佳实践与安全建议

  12. 总结与发布清单


1. 前言与总体流程

集成 Google、Facebook、Firebase 的常见目标:

  • 提供多种第三方登录方式(Google、Facebook);

  • 使用 Firebase 提供的后端服务:认证(Auth)、实时数据库/Firestore、云存储、Crashlytics、远程配置、云消息(FCM)等;

  • 在客户端通过第三方登录获取凭证(ID Token / Access Token),并交给 Firebase Auth 做联合登录,或者用于自有后端鉴权。

总体步骤(高层):

  1. 在各自控制台(Google Cloud / Facebook Developer / Firebase Console)注册应用、配置包名与 SHA-1。

  2. 在 Android 项目中配置 Gradle 依赖与 AndroidManifest。

  3. 在 Activity/Fragment 中实现登录流程,获取 token。

  4. 用 token 调用 FirebaseAuth.signInWithCredential(...) 或你自有后端换取 session。

  5. 配置 FCM、Crashlytics 等并在代码中初始化。

下面分项详细说明。


2. 通用准备(包名、SHA、OAuth 重点)

在开始之前请准备:

  • Android 包名(applicationId):如 com.example.app

  • Debug/Release 的 SHA-1 和 SHA-256 指纹(用于 OAuth 客户端):

    • Android Studio Terminal:

      bash 复制代码
      # debug keystore
      keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
      
      # release keystore
      keytool -list -v -keystore /path/to/your/release.jks -alias your_alias
  • Google Cloud Console / Facebook Developer / Firebase 控制台的账号权限(通常用项目 owner)。

为什么要 SHA-1:Google Sign-In 与 Firebase Auth 的 Android OAuth 依赖 SHA-1 来验证应用签名,Facebook 也会需要 key hashes(类似作用)。


3. Google Sign-In 集成(详)

3.1 Google Cloud / Firebase 控制台配置

  • 向 Google Cloud Project 或 Firebase 项目中添加 Android 应用,填写包名和 SHA-1。

  • 下载 google-services.json(Firebase 控制台)并放入 app/ 目录。

3.2 Gradle 依赖(project & app)

build.gradle (project):

Groovy 复制代码
buildscript {
    dependencies {
        classpath 'com.google.gms:google-services:4.4.0' // 或最新版
    }
}

build.gradle (app):

Groovy 复制代码
plugins { id 'com.android.application'; id 'kotlin-android' }
android { /* ... */ }
dependencies {
    implementation 'com.google.android.gms:play-services-auth:20.6.0' // Google Sign-In SDK
    implementation 'com.google.firebase:firebase-auth-ktx:22.1.0' // Firebase Auth
    // 如果使用 Firebase 全家桶,别忘了 analytics/others
}
apply plugin: 'com.google.gms.google-services'

版本号请按当前最新稳定版本替换。

3.3 AndroidManifest

需要 INTERNET 权限(通常已加):

Groovy 复制代码
<uses-permission android:name="android.permission.INTERNET" />

在 Activity 中处理结果无需在 Manifest 声明 Activity 特殊项(Google Sign-In 用 APIs 处理)。

3.4 Kotlin 示例:Google Sign-In(简洁版)

Kotlin 复制代码
// Step 1: 配置 GoogleSignInOptions(获取 ID Token)
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
    .requestIdToken(getString(R.string.default_web_client_id)) // 从 google-services.json / 控制台获取
    .requestEmail()
    .build()

val client = GoogleSignIn.getClient(this, gso)

// Step 2: 发起登录
private val RC_SIGN_IN = 1001
fun signInWithGoogle() {
    val signInIntent = client.signInIntent
    startActivityForResult(signInIntent, RC_SIGN_IN)
}

// Step 3: 结果回调(Activity)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == RC_SIGN_IN) {
        val task = GoogleSignIn.getSignedInAccountFromIntent(data)
        try {
            val account = task.getResult(ApiException::class.java)
            val idToken = account?.idToken
            idToken?.let { firebaseAuthWithGoogle(it) }
        } catch (e: ApiException) {
            // 登录失败处理
        }
    }
}

// Step 4: 用 idToken 登录 Firebase(可选)
private fun firebaseAuthWithGoogle(idToken: String) {
    val credential = GoogleAuthProvider.getCredential(idToken, null)
    FirebaseAuth.getInstance().signInWithCredential(credential)
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                val user = FirebaseAuth.getInstance().currentUser
                // 登录成功,处理 user
            } else {
                // 失败处理
            }
        }
}

3.5 注意点与常见坑

  • default_web_client_id 来自 google-services.json。如果 OAuth 客户端没配置正确,idToken 会为空或验证失败。

  • 在 Release 构建时记得在 Firebase 控制台添加 Release keystore 的 SHA-1。

  • 若要只使用 Google 登录而不使用 Firebase,拿到 idTokenaccessToken 交给自有后端即可。


4. Facebook Login 集成(详)

4.1 在 Facebook Developer 控制台配置

  • 创建 Facebook App,添加 Android 平台:

    • 填写包名(applicationId);

    • 添加 Key Hash(debug/release):keytool + openssl 生成(或 Facebook docs 方法)。

  • 配置 OAuth redirect URIs(若使用 web flow)。

4.2 Gradle 依赖

app/build.gradle 中:

Groovy 复制代码
dependencies {
    implementation 'com.facebook.android:facebook-android-sdk:19.2.0' // 以最新版为准
    implementation 'com.google.firebase:firebase-auth-ktx:22.1.0' // 若与 Firebase 联动
}

4.3 AndroidManifest(必需项)

XML 复制代码
<manifest>
    <application>
        <!-- Facebook AppId -->
        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id"/>

        <!-- 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>
</manifest>

strings.xml 添加:

XML 复制代码
<string name="facebook_app_id">YOUR_FACEBOOK_APP_ID</string>
<string name="fb_login_protocol_scheme">fbYOUR_FACEBOOK_APP_ID</string>

4.4 Kotlin 示例:Facebook Login

Kotlin 复制代码
class LoginActivity : AppCompatActivity() {

    private lateinit var callbackManager: CallbackManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        FacebookSdk.sdkInitialize(applicationContext) // 有时不需要,官方有自动初始化
        setContentView(R.layout.activity_login)

        callbackManager = CallbackManager.Factory.create()

        val loginButton = findViewById<LoginButton>(R.id.login_button)
        loginButton.setPermissions(listOf("email", "public_profile"))

        loginButton.registerCallback(callbackManager, object : FacebookCallback<LoginResult> {
            override fun onSuccess(result: LoginResult) {
                val accessToken = result.accessToken.token
                // 交给 Firebase 登录或自家后端
                firebaseAuthWithFacebook(accessToken)
            }
            override fun onCancel() { /* 取消 */ }
            override fun onError(error: FacebookException) { /* 失败 */ }
        })
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        callbackManager.onActivityResult(requestCode, resultCode, data)
        super.onActivityResult(requestCode, resultCode, data)
    }

    private fun firebaseAuthWithFacebook(token: String) {
        val credential = FacebookAuthProvider.getCredential(token)
        FirebaseAuth.getInstance().signInWithCredential(credential)
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    // 登录成功
                } else {
                    // 失败处理
                }
            }
    }
}

4.5 注意点

  • Facebook 的 Key Hash 必须正确,否则登录会出现 Invalid key hash 错误(查看 Logcat 或 Facebook 控制台日志)。

  • 若使用自定义按钮而调用 LoginManager, 请确保 CallbackManager 处理 onActivityResult

  • Android 11+ 与浏览器的 Custom Tab 自动重定向行为要注意:使用最新版 Facebook SDK 可以避免大多数问题。


5. Firebase 全家桶接入(详)

5.1 创建 Firebase 项目并添加 Android 应用

  • 在 Firebase Console 中创建项目,选择或创建 Google Cloud 项目。

  • 添加 Android 应用,填写包名,添加 SHA-1,下载 google-services.jsonapp/

5.2 Gradle 配置(project & app)

build.gradle (project):

Groovy 复制代码
buildscript {
    dependencies {
        classpath 'com.google.gms:google-services:4.4.0'
        classpath 'com.google.firebase.crashlytics:firebase-crashlytics-gradle:2.9.6' // Crashlytics plugin
    }
}

build.gradle (app):

Groovy 复制代码
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'com.google.gms.google-services'
    id 'com.google.firebase.crashlytics'
}
dependencies {
    implementation 'com.google.firebase:firebase-analytics-ktx:21.3.0'
    implementation 'com.google.firebase:firebase-auth-ktx:22.1.0'
    implementation 'com.google.firebase:firebase-firestore-ktx:24.5.0'
    implementation 'com.google.firebase:firebase-storage-ktx:20.2.0'
    implementation 'com.google.firebase:firebase-messaging-ktx:23.1.0'
    implementation 'com.google.firebase:firebase-crashlytics-ktx:18.3.10'
    implementation 'com.google.firebase:firebase-perf-ktx:20.3.2'
}

版本请按当前最新稳定版本替换。

5.3 初始化(通常自动)

  • google-services plugin 会自动读取 google-services.json 并注入。

  • Crashlytics/Performance 需要在 Application 中初始化(通常 SDK 自动初始化即可):

Kotlin 复制代码
class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        FirebaseApp.initializeApp(this) // 可选,通常自动
    }
}

并在 Manifest 注册 Application。


6. Firebase Auth:用 Google / Facebook Token 登录(示例)

(上面我们已经在 Google/Facebook 部分演示了如何把 token 交给 Firebase)

通用流程:

  1. 获取第三方登录 token(Google idToken / Facebook accessToken)。

  2. 构建 Firebase Credential:

    • Google: GoogleAuthProvider.getCredential(idToken, null)

    • Facebook: FacebookAuthProvider.getCredential(accessToken)

  3. FirebaseAuth.getInstance().signInWithCredential(credential) 完成登录。

6.1 Token 过期处理 & 安全

  • Firebase Auth 会处理 token 刷新与会话保持(client SDK)。

  • 若你在后端使用 token 做验证,应在服务端使用 Firebase Admin SDK 验证 ID token 的有效性(不是在客户端完成)。


7. Firebase Cloud Messaging(FCM)接入要点

7.1 Gradle 依赖(见上)

7.2 Manifest 权限与 Service

AndroidManifest.xml

XML 复制代码
<service
    android:name=".MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

7.3 实现 Service

Kotlin 复制代码
class MyFirebaseMessagingService : FirebaseMessagingService() {
    override fun onNewToken(token: String) {
        super.onNewToken(token)
        // 将 token 上传到你的后端
    }

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        super.onMessageReceived(remoteMessage)
        // 处理通知/透传消息
        val data = remoteMessage.data
        val notification = remoteMessage.notification
        // 构建 Notification 展示给用户(若需要)
    }
}

7.4 获取 token 并上传服务器

Kotlin 复制代码
FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        val token = task.result
        // 上传到后端
    }
}

7.5 注意点

  • 在 Android 13 以上,推送不需要额外通知权限(但通知通道需设置)。

  • 在某些厂商手机,需要做额外适配(自启、后台限制)--- 在用户文档中告知如何开启推送相关权限。

  • FCM 数据消息(透传)在某些系统上被系统杀死时可能收不到,重要数据最好同步到后端并在应用启动时拉取。


8. Crashlytics / Performance / Remote Config 快速上手

8.1 Crashlytics

  • 集成依赖并插件(见上),Crashlytics 会自动捕获未捕获异常。

  • 在调试时想强制发送崩溃报告,可以手动触发:

Kotlin 复制代码
Firebase.crashlytics.recordException(Exception("Test exception"))
  • 确保在 Firebase Console 中接受隐私合规条款并在 Release 构建打开上传符号(mapping file)。

8.2 Performance Monitoring

  • 添加 firebase-perf-ktx,性能监控会自动捕获基本指标;可自定义 trace:
Kotlin 复制代码
val trace = Firebase.performance.newTrace("load_home")
trace.start()
// do work
trace.stop()

8.3 Remote Config

  • 获取默认参数、拉取远程配置:
Kotlin 复制代码
val remoteConfig = Firebase.remoteConfig
remoteConfig.setDefaultsAsync(mapOf("welcome_msg" to "Hello"))
remoteConfig.fetchAndActivate().addOnCompleteListener { task ->
    if (task.isSuccessful) {
        val message = remoteConfig.getString("welcome_msg")
    }
}

9. ProGuard / R8、权限、隐私与合规(GDPR)

9.1 ProGuard / R8 规则(常见)

diff 复制代码
# Firebase
-keep class com.google.firebase.** { *; }
-dontwarn com.google.firebase.**
-keepattributes *Annotation*

# Facebook SDK
-keep class com.facebook.** { *; }
-dontwarn com.facebook.**

# Google Play services
-keep class com.google.android.gms.** { *; }
-dontwarn com.google.android.gms.**

实际情况参考 SDK 文档的最新 ProGuard 规则,把混淆规则放入 proguard-rules.pro

9.2 权限

  • 最小化权限:只有必要时声明权限(INTERNET、POST_NOTIFICATIONS(Android13+)等)。

  • 若使用相机/相册/位置等,要在运行时申请并说明用途。

9.3 隐私合规(GDPR、CCPA 等)

  • 收集个人信息(邮箱、姓名、照片)需用户明确同意。

  • 提供隐私与数据处理声明(隐私政策)。

  • 支持用户注销 / 删除账户并删除服务器端数据。

  • Crashlytics、Analytics 等需在隐私策略中声明,并在必要时提供开启/关闭选项。


10. 调试、常见错误与排查清单

常见错误与解决办法

  • idToken == null(Google Sign-In)

    • 确认 requestIdToken() 使用的 web client id 与 Firebase 项目一致;检查 google-services.json 与 OAuth 客户端配置和 SHA-1。
  • Invalid key hash(Facebook)

    • 在 Logcat 或 Facebook 控制台查看 key hash,使用 keytool / openssl 生成,并添加到 Facebook 开发者设置。
  • Firebase Auth ERROR_INVALID_CREDENTIAL

    • token 过期或不匹配,重新获取第三方 token 并重试。
  • FCM 无法收到通知

    • 检查 google-services.json、包名、SHA 是否一致;确保 Service 注册正确、系统通知权限与厂商限制。
  • Crashlytics 不上报崩溃

    • 确保 release build 上传 mapping(在 CI 中配置 uploadMapping),并未关闭 Crashlytics。在 debug 模式 Crashlytics 有延迟或不自动上传。

调试小贴士

  • 使用真实设备测试 third-party login(部分 emulator 没有 Google Play 或浏览器 behavior)。

  • 在 Firebase Console 的 Authentication -> Sign-in method 中启用 Google / Facebook。

  • 在 Facebook App 下的 "App Review" 中,测试帐号才能使用未审核权限。

  • 使用 adb logcat 获取 SDK 报错信息(Facebook/Google SDK 都会打印详细日志)。


11. 最佳实践与安全建议

  • 不在客户端保存敏感 token(长期) :短期凭证可以保存在 EncryptedSharedPreferences,长期凭证应由服务器管理并下发会话 token。

  • 后台校验 token:后端使用 Firebase Admin SDK 或 Google APIs 验证 ID Token。

  • CI/CD 自动化:在 CI 中自动化上传 mapping 文件和构建产物,确保 Crashlytics 的符号表可用。

  • 按需初始化 SDK:避免在 Application 中初始化不必要的 SDK,按需延迟加载可提高冷启动速度。

  • 监控与埋点:使用 Firebase Analytics 或自建埋点监控登录、推送 token 注册、关键错误等。

  • 测试账户管理:在 Facebook 上添加测试用户,在 Google OAuth 客户端上配置测试用户 / 测试域。


12. 发布前检查清单(Release checklist)

  • 在 Firebase 控制台添加 Release SHA-1(确保 Auth 在 release 下工作)

  • 在 Facebook 设置好 release key hash 和 app review(或在 review 前使用测试用户)

  • google-services.json 为正确环境(prod vs staging)

  • Crashlytics、Perf 的 Gradle plugin 已配置并 mapping 上传自动化

  • ProGuard / R8 规则已验证(release build 测试)

  • 隐私政策与用户同意(登录与数据收集)已实现并可追踪

  • FCM 推送在主要机型上验证(小米、华为等特殊厂商)


参考示例代码仓库结构(建议)

复制代码
/app
  /src/main
    /java/com/example/app
      /auth
        GoogleAuthManager.kt
        FacebookAuthManager.kt
        FirebaseAuthRepository.kt
      MyFirebaseMessagingService.kt
      MainActivity.kt
    AndroidManifest.xml
  google-services.json
build.gradle
proguard-rules.pro

下面是一个 Demo 项目结构 + 核心代码 ,以及一个 分步骤教程的文字说明:

一、Demo 项目结构(目录示例)

复制代码
FirebaseGoogleFacebookDemo/
 ├── app/
 │   ├── src/
 │   │   ├── main/
 │   │   │   ├── java/com/example/demo/
 │   │   │   │   ├── auth/
 │   │   │   │   │   GoogleAuthManager.kt
 │   │   │   │   │   FacebookAuthManager.kt
 │   │   │   │   │   FirebaseAuthRepository.kt
 │   │   │   │   ├── messaging/
 │   │   │   │   │   MyFirebaseMessagingService.kt
 │   │   │   │   ├── ui/
 │   │   │   │   │   MainActivity.kt
 │   │   │   │   │   LoginActivity.kt
 │   │   │   │   └── DemoApplication.kt
 │   │   │   ├── AndroidManifest.xml
 │   │   │   └── res/
 │   │   │       ├── layout/
 │   │   │       │   activity_main.xml
 │   │   │       │   activity_login.xml
 │   │   │       └── values/
 │   │   │           strings.xml
 │   ├── build.gradle
 │   └── proguard-rules.pro
 ├── build.gradle
 └── settings.gradle

二、核心代码示例

下面是 Demo 项目中几个关键文件的示例代码,可复制入项目中并调试。

2.1 DemoApplication.kt

Kotlin 复制代码
package com.example.demo

import android.app.Application
import com.google.firebase.FirebaseApp

class DemoApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        FirebaseApp.initializeApp(this)
        // 其他 SDK 如 Facebook 初始化如果必要
    }
}

记得在 AndroidManifest.xml 中设置 android:name=".DemoApplication"


2.2 GoogleAuthManager.kt

Kotlin 复制代码
package com.example.demo.auth

import android.app.Activity
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.firebase.auth.GoogleAuthProvider
import com.google.firebase.auth.FirebaseAuth

object GoogleAuthManager {

    private const val RC_GOOGLE_SIGN_IN = 1001

    fun makeSignInIntent(activity: Activity): android.content.Intent {
        val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(activity.getString(R.string.default_web_client_id))
            .requestEmail()
            .build()
        return GoogleSignIn.getClient(activity, gso).signInIntent
    }

    fun handleSignInResult(
        activity: Activity,
        data: android.content.Intent?,
        onSuccess: (uid: String) -> Unit,
        onFailure: (Exception) -> Unit
    ) {
        val task = GoogleSignIn.getSignedInAccountFromIntent(data)
        try {
            val account = task.getResult(com.google.android.gms.common.api.ApiException::class.java)
            val idToken = account?.idToken
            if (idToken != null) {
                val credential = GoogleAuthProvider.getCredential(idToken, null)
                FirebaseAuth.getInstance().signInWithCredential(credential)
                    .addOnCompleteListener(activity) { task2 ->
                        if (task2.isSuccessful) {
                            val user = FirebaseAuth.getInstance().currentUser
                            user?.uid?.let { onSuccess(it) }
                        } else {
                            task2.exception?.let { onFailure(it) }
                        }
                    }
            } else {
                onFailure(Exception("ID Token is null"))
            }
        } catch (e: Exception) {
            onFailure(e)
        }
    }
}

2.3 FacebookAuthManager.kt

Kotlin 复制代码
package com.example.demo.auth

import android.app.Activity
import com.facebook.AccessToken
import com.facebook.login.LoginManager
import com.facebook.login.LoginResult
import com.facebook.CallbackManager
import com.facebook.FacebookCallback
import com.facebook.FacebookException
import com.google.firebase.auth.FacebookAuthProvider
import com.google.firebase.auth.FirebaseAuth

class FacebookAuthManager(private val activity: Activity) {

    val callbackManager = CallbackManager.Factory.create()

    fun loginWithFacebook(onSuccess: (uid: String) -> Unit, onFailure: (Exception) -> Unit) {
        LoginManager.getInstance().logInWithReadPermissions(activity, listOf("email", "public_profile"))
        LoginManager.getInstance().registerCallback(callbackManager,
            object : FacebookCallback<LoginResult> {
                override fun onSuccess(result: LoginResult) {
                    handleAccessToken(result.accessToken, onSuccess, onFailure)
                }
                override fun onCancel() {
                    onFailure(Exception("Facebook login canceled"))
                }
                override fun onError(error: FacebookException) {
                    onFailure(error)
                }
            })
    }

    private fun handleAccessToken(token: AccessToken, onSuccess: (String) -> Unit, onFailure: (Exception) -> Unit) {
        val credential = FacebookAuthProvider.getCredential(token.token)
        FirebaseAuth.getInstance().signInWithCredential(credential)
            .addOnCompleteListener(activity) { task ->
                if (task.isSuccessful) {
                    FirebaseAuth.getInstance().currentUser?.uid?.let { onSuccess(it) }
                } else {
                    task.exception?.let { onFailure(it) }
                }
            }
    }
}

在 Activity 的 onActivityResult 中调用 callbackManager.onActivityResult(...)


2.4 MyFirebaseMessagingService.kt

Kotlin 复制代码
package com.example.demo.messaging

import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage

class MyFirebaseMessagingService : FirebaseMessagingService() {
    override fun onNewToken(token: String) {
        super.onNewToken(token)
        // 上传 token 给你后端或者关联用户
    }

    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        super.onMessageReceived(remoteMessage)
        // 处理消息、通知显示
    }
}

2.5 LoginActivity.kt

Kotlin 复制代码
package com.example.demo.ui

import android.os.Bundle
import android.app.Activity
import android.content.Intent
import com.example.demo.R
import com.example.demo.auth.GoogleAuthManager
import com.example.demo.auth.FacebookAuthManager

class LoginActivity : Activity() {
    private lateinit var facebookAuthManager: FacebookAuthManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)

        facebookAuthManager = FacebookAuthManager(this)

        findViewById<android.view.View>(R.id.btn_google).setOnClickListener {
            startActivityForResult(GoogleAuthManager.makeSignInIntent(this), 1001)
        }

        findViewById<android.view.View>(R.id.btn_facebook).setOnClickListener {
            facebookAuthManager.loginWithFacebook(
                onSuccess = { uid ->
                    // 登录成功
                }, onFailure = { e ->
                    e.printStackTrace()
                }
            )
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 1001) {
            GoogleAuthManager.handleSignInResult(this, data,
                onSuccess = { uid -> /* 登录成功 */ },
                onFailure = { e -> e.printStackTrace() }
            )
        }
        facebookAuthManager.callbackManager.onActivityResult(requestCode, resultCode, data)
    }
}

III. 步骤截图版教程(文字 + 拍摄提示)

下面是你在写博客教程时可以搭配截图的步骤说明。你可以在每一步操作时截控制台、控制面板、Android Studio UI 来丰富教程。


步骤 1:创建 Firebase 项目 & 添加 Android 应用

  • 在 Firebase Console → "项目设置" → "添加应用" → 选择 Android → 填写包名、SHA-1 → 下载 google-services.json

  • 截图:Firebase 控制台添加应用界面 + 下载 google-services.json


步骤 2:在 Google Cloud Console 创建 OAuth 客户端

  • 在 Google Cloud → API & Services → 凭据 → 创建 OAuth 2.0 客户端 ID → 类型为 Android → 填包名和 SHA-1

  • 启用 Google Sign-In API

  • 截图:创建 OAuth 客户端界面 + 包名 / SHA-1 填写界面


步骤 3:在 Facebook Developer 控制台配置 Android 平台

  • 登录 Facebook Developer → 选择你的 App → 设置 → 加平台 → Android → 填包名 + key hash

  • 获取 key hash:在本地 keytool | openssl 生成,复制粘贴

  • 截图:Facebook 控制台 Android 平台配置界面 + Key Hash 填写界面


步骤 4:配置 Android 项目的 Gradle 和 Manifest

  • google-services.json 放到 app/ 目录

  • 修改 settings.gradle / build.gradle(project & app)加入 Firebase / Google / Facebook plugin 与 SDK 依赖

  • AndroidManifest.xml 添加 Facebook 相关 <meta-data> 与 Activity

截图:Gradle 文件(project & app)代码片段 + AndroidManifest 中关键部分


步骤 5:启动 Demo 应用,测试 Google 登录

  • 启动 APP → 点击 "Google 登录" 按钮 → 弹出 Google 登录界面 → 选择账号 → 返回并登录成功

  • 截图:Google 登录界面 / 登录后用户页面


步骤 6:测试 Facebook 登录

  • 启动 APP → 点击 "Facebook 登录" → 弹出 Facebook 授权界面 → 同意登录 → 返回应用

  • 截图:Facebook 登录授权界面 / 登录后用户页面


步骤 7:Firebase 控制台验证 Authentication

  • 在 Firebase Console → Authentication → 用户页,查看是否有刚才登录的用户 UID

  • 截图:Firebase Authentication 控制台用户列表,展示 UID / email


步骤 8:测试推送功能(FCM)

  • 在 Firebase Console → Cloud Messaging → 发送测试通知到该设备

  • 观察手机收到通知 / 在 onMessageReceived 的打印

  • 截图:Firebase 控制台发送通知界面 + 手机收到通知界面


步骤 9:测试崩溃日志(Crashlytics)

  • 在 APP 中抛出一个未捕获异常(比如 throw RuntimeException("Test Crash")

  • 等待一段时间,在 Firebase Console → Crashlytics 查看受影响版本、堆栈信息

  • 截图:APP 崩溃界面 + Crashlytics 控制台崩溃日志界面


步骤 10:业务流程整合说明与截图

在你博客里,可以给出一张整体流程图(Google 登录 → Firebase Auth → 后端 Session / Token,Facebook 登录流程类似),搭配每一步操作的截图说明。


IV. 补充建议

  • 在博客中把这些截图高亮关键字段(包名、SHA、OAuth 客户端 ID、Key Hash 等)

  • 对于调试错误(如 key hash 错误、idToken null 错误)要给出常见报错信息截图 + 解决方案

  • 如果你用 CI/CD 自动化发布,还可以补充 mapping 上报、自动构建脚本截图

结语

集成 Google、Facebook 与 Firebase 看似繁杂,但按"控制台配置 → Gradle 依赖 → Manifest 权限 → 代码集成 → 后端验证"的步骤系统化操作,就能稳妥完成。

务必把安全与隐私放在优先考量:签名(SHA)、token 校验、用户同意与删除数据能力是上生产线前的关键。

相关推荐
StarShip40 分钟前
从Activity.setContentView()开始
android
千里马学框架1 小时前
重学SurfaceFlinger之Layer显示区域bounds计算剖析
android·智能手机·sf·安卓framework开发·layer·surfaceflinger·车载开发
nono牛2 小时前
安卓休眠与唤醒流程
android
二流小码农3 小时前
鸿蒙开发:个人开发者如何使用华为账号登录
android·ios·harmonyos
StarShip3 小时前
Android View框架概览
android·计算机图形学
愤怒的代码3 小时前
解析Android内存分析的指标
android·app
summerkissyou19873 小时前
android-hardware/interfaces/automotive和hardware/libhardware/include/hardware区别
android
Evan芙4 小时前
mysql二进制部署以及多实例部署
android·数据库·mysql
走在路上的菜鸟4 小时前
Android学Dart学习笔记第二十三节 类-扩展类型
android·笔记·学习·flutter
百***78755 小时前
【技术教程】3步极速接入GPT-5.1:零门槛体验多模态AI能力
android·java·人工智能·gpt·opencv