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

Firebase登录卡顿+NullPointerException+GmsCore错误求助(Java新手)

Java Firebase登录页面:弹窗持续显示+NullPointerException+Invalid GmsCore APK问题

问题概述

  • 点击登录按钮后,页面一直显示「Please waiting」弹窗,无法跳转至首页,同时触发NullPointerException;
  • 出现「Invalid GmsCore APK」提示:远程加载已禁用,缺少Google Play Store,Firebase对象访问触发空指针异常。

相关资源

Realtime Database截图

Realtime Database截图

SignIn页面代码

package com.example.eatit_new;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;

import com.example.eatit_new.Common.Common;
import com.example.eatit_new.Model.User;
import com.google.android.material.snackbar.Snackbar;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;

import com.example.eatit_new.databinding.ActivitySignInBinding;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.rengwuxian.materialedittext.MaterialEditText;

public class SignIn extends AppCompatActivity {
    EditText editPhone, editPassword;
    Button btnSignIn;
@Override
    protected void onCreate (Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        setContentView(R.layout.activity_sign_in);

        editPassword=(MaterialEditText)findViewById(R.id.editPassword);

        editPhone= (MaterialEditText)findViewById(R.id.editPhone);
        btnSignIn = (Button) findViewById(R.id.btnSignIn);

    //init Database
    final FirebaseDatabase database= FirebaseDatabase.getInstance();
    final DatabaseReference table_user=database.getReference("User");

btnSignIn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        final ProgressDialog mDialog = new ProgressDialog(SignIn.this);
        mDialog.setMessage("Please waiting....");
        mDialog.show();

        table_user.addValueEventListener( new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                //Check if user not exist in database

                if (dataSnapshot.child(editPhone.getText().toString()).exists()) {

                    //Get User Information
                    mDialog.dismiss();
                    User user = dataSnapshot.child(editPhone.getText().toString()).getValue(User.class);
                    if (user.getPassword().equals(editPassword.getText().toString())) {

                        Intent homeIntent= new Intent(SignIn.this,Home.class);
                        Common.currentUser= user;
                        startActivity(homeIntent);
                        finish();
                    } else {
                        Toast.makeText(SignIn.this, "Wrong password!", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    mDialog.dismiss();
                    Toast.makeText(SignIn.this, "User not exists!", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
});
}
}

User类代码

package com.example.eatit_new.Model;

public class User {
    String name;
    String password;

    public User() {
    }

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public User(String name, String password) {
    this.name = name;
    this.password = password;
}
}

附加截图

附加截图1
附加截图2

报错截图

NullPointerException报错截图

解决方案

一、解决「Invalid GmsCore APK」与Firebase空指针问题

Firebase依赖Google Play Services运行,该提示说明测试设备缺少相关服务:

  1. 若使用模拟器:创建带Google Play服务的镜像(选择「Google APIs」或「Google Play」类型的系统镜像),不要使用纯Android原生镜像;
  2. 若使用真机:确保设备安装了Google Play Store,且Google Play Services为最新版本;
  3. 检查项目依赖:确认Module级build.gradle中添加了必要依赖,同步后重新运行:
    implementation 'com.google.firebase:firebase-database:20.3.0'
    implementation 'com.google.android.gms:play-services-base:18.2.0'
    

二、解决弹窗持续显示+NullPointerException问题

空指针大概率因user对象为空、输入框文本为空,或未处理数据库请求失败导致,按以下步骤修改:

  1. 添加空值校验:在获取用户数据前校验输入合法性,获取后校验对象不为空:
    修改onDataChange方法:
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String phone = editPhone.getText().toString().trim();
        String password = editPassword.getText().toString().trim();
    
        if (phone.isEmpty() || password.isEmpty()) {
            mDialog.dismiss();
            Toast.makeText(SignIn.this, "请输入手机号和密码", Toast.LENGTH_SHORT).show();
            return;
        }
    
        if (dataSnapshot.child(phone).exists()) {
            mDialog.dismiss();
            User user = dataSnapshot.child(phone).getValue(User.class);
            if (user != null) {
                if (user.getPassword().equals(password)) {
                    Intent homeIntent= new Intent(SignIn.this,Home.class);
                    Common.currentUser= user;
                    startActivity(homeIntent);
                    finish();
                } else {
                    Toast.makeText(SignIn.this, "密码错误!", Toast.LENGTH_SHORT).show();
                }
            } else {
                Toast.makeText(SignIn.this, "用户数据加载失败", Toast.LENGTH_SHORT).show();
            }
        } else {
            mDialog.dismiss();
            Toast.makeText(SignIn.this, "用户不存在!", Toast.LENGTH_SHORT).show();
        }
    }
    
  2. 处理onCancelled回调:数据库请求失败时关闭弹窗并提示,避免弹窗一直显示:
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        mDialog.dismiss();
        Toast.makeText(SignIn.this, "数据库请求失败:" + databaseError.getMessage(), Toast.LENGTH_SHORT).show();
    }
    
  3. 改用单次数据监听:登录只需一次性获取数据,替换addValueEventListener为addListenerForSingleValueEvent,避免不必要的持续监听:
    table_user.addListenerForSingleValueEvent(new ValueEventListener() {
        // 内部方法同上修改
    });
    

内容的提问来源于stack exchange,提问作者Đoàn Thanh Thảo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:00:48