如何实现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
相关产品推荐
相关产品推荐

