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 校验、用户同意与删除数据能力是上生产线前的关键。

相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
ai2work1 天前
ch23 综合复刻:从零做一个最小可用版本(capstone)
kotlin
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
ai2work1 天前
ch21 签名、校验与发版
kotlin
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui