Android接入Firebase实时数据库遇权限拒绝、主线程崩溃及登录后无法跳转HomeActivity求助
排查与修复方案
1. 数据库权限拒绝问题修复
你当前配置的实时数据库规则存在2处语法错误,直接导致权限校验失效:
- 布尔值加了多余引号:
.read、.write要求传入合法布尔表达式,字符串形式的"true"会被规则引擎判定为非法值,默认返回拒绝权限 - 存在尾随逗号:最后一个
.write键值对后面多了逗号,JSON语法不允许该写法,会导致整个规则块解析失败,回到初始的拒绝访问状态 - 测试环境可使用的正确规则写法:
{ "rules": { ".read": true, ".write": true } }
该规则完全放开数据库读写,仅适合本地测试,正式上线前必须调整为仅允许已认证用户读写自身节点的安全规则
2. 主线程崩溃问题修复
崩溃和修改数据库规则无直接关联:之前因规则语法错误,权限校验一直不通过,代码在数据库监听回调阶段就被阻断,根本走不到跳转HomeActivity、加载布局的流程;等规则修正打通流程后,才触发代码中已存在的崩溃点。
从贴出的代码与配置中,定位到3个直接触发主线程崩溃的问题:
- 布局属性值错误(核心崩溃原因):你贴出的
content_home布局中,app:layout_behavior的属性值是截断的android.support.design.widget.AppBarLayout$ScrollingVie...- 该类属于已废弃的旧Support库,当前项目采用AndroidX架构,不存在该包名下的类
- 属性值本身不完整,系统加载布局时会尝试根据字符串反射实例化Behavior类,直接抛出类找不到的异常,触发主线程崩溃
- 正确的属性值配置:
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
- 导航跳转的Activity漏注册:你在
HomeActivity的导航点击逻辑中,编写了启动AllPeopleActivity的逻辑,若该Activity未在AndroidManifest.xml中注册,触发跳转时会抛出异常导致崩溃 - 代码中冗余的强转逻辑:初始化登录提供者列表时,多余的强转逻辑可以删除,降低类型转换风险:
// 冗余强转写法 providers = (List<AuthUI.IdpConfig>) Arrays.asList( new AuthUI.IdpConfig.EmailBuilder().build(), new AuthUI.IdpConfig.GoogleBuilder().build() ); // 简化后正确写法 providers = Arrays.asList( new AuthUI.IdpConfig.EmailBuilder().build(), new AuthUI.IdpConfig.GoogleBuilder().build() );
3. 代码逻辑优化建议
- 简化用户存在性校验逻辑:原代码通过
orderByKey().equalTo(uid)判断用户是否存在的写法完全冗余,直接获取对应节点的快照判断即可,减少一次远程查询开销:
user_information.child(firebaseUser.getUid()) .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (!snapshot.exists()) { Common.loggedUser = new User(firebaseUser.getUid(), firebaseUser.getEmail()); user_information.child(firebaseUser.getUid()).setValue(Common.loggedUser); } else { Common.loggedUser = snapshot.getValue(User.class); } updateToken(firebaseUser); setupUI(); } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show(); } });
- 替换已废弃的API:当前获取设备推送Token的代码使用了已废弃的
FirebaseInstanceId类,后续会影响推送功能,可替换为Firebase Messaging提供的官方方法获取Token。
内容的提问来源于stack exchange,提问作者EXCITED AID
相关产品推荐
相关产品推荐

