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

如何实现Firebase谷歌登录时仅首次登录向用户展示服务条款?

实现方案

完全可以将用户的条款同意状态存储到Firebase中,你可以选择Firestore(云Firestore) 或者Firebase Realtime Database存储状态,同时也可以搭配本地SharedPreferences做缓存,减少网络请求提升体验。

实现步骤

1. 前置配置

先在你的项目中引入Firestore依赖(如果还没引入的话),在模块级build.gradle中添加:

dependencies {
    implementation 'com.google.firebase:firebase-firestore:24.10.0'
}

然后在Firebase控制台开启Firestore服务,配置安全规则,保证仅用户自己可读写自己的同意状态:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

2. 修改登录页逻辑

原来的resultLogin方法中,登录成功后直接跳转首页,现在需要先查询当前登录用户的条款同意状态:

private void resultLogin(GoogleSignInAccount account) {
    AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
    auth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if(task.isSuccessful()) {
                // 登录成功,获取当前用户uid
                String uid = auth.getCurrentUser().getUid();
                FirebaseFirestore db = FirebaseFirestore.getInstance();
                // 查询用户文档中的同意状态
                db.collection("users").document(uid).get()
                    .addOnSuccessListener(documentSnapshot -> {
                        if (documentSnapshot.exists() && Boolean.TRUE.equals(documentSnapshot.getBoolean("terms_accepted"))) {
                            // 已经同意过条款,直接跳首页
                            startActivity(new Intent(getApplicationContext(), Home.class));
                            finish();
                        } else {
                            // 未同意,跳条款页
                            startActivity(new Intent(getApplicationContext(), TermsActivity.class));
                            finish();
                        }
                    })
                    .addOnFailureListener(e -> {
                        // 查询失败可以默认跳条款页,或者提示网络错误
                        Toast.makeText(LoginActivity.this, "网络异常,请稍后重试", Toast.LENGTH_SHORT).show();
                    });
            } else {
                Toast.makeText(LoginActivity.this,"로그인 실패",Toast.LENGTH_SHORT).show();
            }
        }
    });
}

3. 修改条款页确认逻辑

给条款页的确认按钮添加点击事件,用户勾选必填条款后点击确认,将同意状态写入Firestore:

btn_complete.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 先校验必填条款是否勾选,这里示例checkBox2和checkBox3是必填项
        if (!checkBox2.isChecked() || !checkBox3.isChecked()) {
            Toast.makeText(TermsActivity.this, "请先同意必填服务条款", Toast.LENGTH_SHORT).show();
            return;
        }
        // 获取当前登录用户uid
        String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
        FirebaseFirestore db = FirebaseFirestore.getInstance();
        // 构造要存储的用户数据
        Map<String, Object> userData = new HashMap<>();
        userData.put("terms_accepted", true);
        userData.put("accepted_time", FieldValue.serverTimestamp()); // 可选存储同意时间
        // 写入Firestore,merge方式不会覆盖用户其他已存数据
        db.collection("users").document(uid)
                .set(userData, SetOptions.merge())
                .addOnSuccessListener(aVoid -> {
                    // 写入成功,跳首页
                    startActivity(new Intent(TermsActivity.this, Home.class));
                    finish();
                })
                .addOnFailureListener(e -> {
                    Toast.makeText(TermsActivity.this, "保存失败,请稍后重试", Toast.LENGTH_SHORT).show();
                });
    }
});

可选优化

如果不需要跨设备同步同意状态,也可以直接用本地SharedPreferences存储同意状态,不需要请求网络,速度更快:

  • 登录成功后先查本地SP有没有terms_accepted=true的标记,有就跳首页,没有就跳条款页
  • 用户同意后写入SP标记即可

内容的提问来源于stack exchange,提问作者Eye Lamp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:15:08