安卓Firebase实时数据库手机号登录:getFullNumber解析失败、onDataChange不执行且崩溃
手机号登录功能异常修复方案
一、CCP 抛出 getFullNumber: Could not parse number 的根因
这个报错是CountryCodePicker组件的常见使用误区导致的:
getFullNumber()方法的设计逻辑是依赖CCP组件内部维护的带国家码的完整号码字段,你没有把用户输入的本地手机号同步到CCP内部,组件拿不到合法输入自然解析失败- 你手动拼接
"+"、手动移除手机号开头0的逻辑,和CCP自带的号码格式化规则完全冲突:CCP本身就支持自动把本地格式的带前导0的手机号,转换为国际通用的E.164格式号码,你手动拆分拼接出来的号码会多带一个"+",最终生成类似++8613800138000的无效字符串,根本没法和数据库里存的合法号码匹配
正确调用姿势:
// 移除手动去掉前导0、手动拼+号的冗余代码 String _localPhone = number.getEditText().getText().toString().trim(); // 把用户输入的本地号码同步给CCP,让组件自己做格式化 countryCodePicker.setNumber(_localPhone); // 直接拿到符合E.164标准的完整手机号(自带+和国家码) String _completePhoneNumber = countryCodePicker.getFormattedFullNumber();
二、onDataChange 回调“不执行”的真相
你觉得回调没正常运行,本质是之前生成的错误格式手机号导致查询逻辑失效:
- 你手动拼接的带双
+的无效号码,在数据库里完全匹配不到条目,回调触发后直接走到snapshot.exists() == false的分支,弹出“User Doesnot Exist”的提示,你误以为回调没执行 - 就算匹配到了用户条目,你现在的取值路径也是错的:用
orderByChild("phoneNumber").equalTo(xxx)查询返回的快照,结构是“匹配的用户节点列表”,根本不是以完整手机号为key的根节点,snapshot.child(_completePhoneNumber)根本取不到对应的密码字段,拿到的systemPassword是null - 拿到null的密码后直接调用
systemPassword.equals(_password),会直接触发空指针异常,打断主线程流程
正确的查询校验逻辑:
Query checkUser = FirebaseDatabase.getInstance() .getReference("Users") .orderByChild("phoneNumber") .equalTo(_completePhoneNumber); checkUser.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (!snapshot.exists()) { Toast.makeText(LoginActivity.this, "User Doesnot Exist!", Toast.LENGTH_SHORT).show(); return; } // 遍历所有匹配到的用户条目 for (DataSnapshot userItem : snapshot.getChildren()) { String savedPwd = userItem.child("password").getValue(String.class); // 先判空再做字符串比较,避免空指针 if (savedPwd != null && savedPwd.equals(_password)) { // 校验通过跳转主页 Toast.makeText(LoginActivity.this, "Login Success", Toast.LENGTH_SHORT).show(); return; } } Toast.makeText(LoginActivity.this, "Password Doesnot Match!", Toast.LENGTH_SHORT).show(); } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(LoginActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show(); } });
三、应用崩溃的关联逻辑
日志里的OpenGL渲染线程崩溃,不是独立的图形问题,是主线程异常的连锁反应:
- 主线程触发空指针、数组越界(比如
_phoneNumber.charAt(0)在号码长度为1的时候越界)后,主线程的事件循环被打断,渲染线程同步出现状态错乱,最终抛出Fatal signal 6的崩溃信号
额外的小修正点:
- 校验逻辑里的
!validateNumber() | !validatePassword()替换为短路或||,减少不必要的方法调用 - 方法名
callHomrScreen存在拼写错误,修正为callHomeScreen
内容的提问来源于stack exchange,提问作者Bibek Timalsina
相关产品推荐
相关产品推荐

