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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 21:27:03