【问题标题】:Android App started crashing after connecting to Firebase连接到 Firebase 后,Android 应用开始崩溃
【发布时间】:2019-02-11 07:16:13
【问题描述】:

我尝试使用 firebase 身份验证服务在 android studio 3.3.1 中创建登录和注册表单。因此,我将 firebase 依赖项添加到构建 gradle 并运行应用程序,当我单击登录或注册按钮时,应用程序崩溃。

这是我的构建 gradle 代码,

     apply plugin: 'com.android.application'
    apply plugin: 'com.google.gms.google-services'

    android {
        compileSdkVersion 28
        defaultConfig {
            applicationId "com.example.finaldemo"
            minSdkVersion 23
            targetSdkVersion 28
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    }

    dependencies {
        implementation fileTree(include: ['*.jar'], dir: 'libs')
        implementation 'com.android.support:appcompat-v7:28.0.0'
        implementation 'com.android.support.constraint:constraint-layout:1.1.3'

        implementation 'com.google.firebase:firebase-database:16.0.6'
        implementation 'com.google.firebase:firebase-core:16.0.7'

        implementation 'com.google.firebase:firebase-auth:16.1.0'
        testImplementation 'junit:junit:4.12'
        androidTestImplementation 'com.android.support.test:runner:1.0.2'
        androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
        implementation 'com.android.support:support-v4:28.0.0'
    }

这是我的登录代码,

import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.example.finaldemo.Model.Users;
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;

public class LoginActivity extends AppCompatActivity {

    private EditText Email,pswrd;
    private Button Login;
    ProgressBar progressBar;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        Email= (EditText)findViewById(R.id.loginemail);
        pswrd=(EditText) findViewById(R.id.loginpswrd);
        Login=(Button)findViewById(R.id.loginbtn);
        progressBar=(ProgressBar)findViewById(R.id.loginprogressbar);

        Login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                LoginUser();
            }
        });
    }
    private void LoginUser(){
        String email = Email.getText().toString().trim();
        String pwd = pswrd.getText().toString().trim();

        if (email.isEmpty()) {
            Email.setError("Email Required");
            Email.requestFocus();

        }

        else if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
            Email.setError("Enter a valid Email Address");
            Email.requestFocus();

        }

        else if (pwd.isEmpty()) {
            pswrd.setError("Password Required");
            pswrd.requestFocus();

        }else{
            progressBar.setVisibility(View.VISIBLE);
            AllowAccess(email,pwd);
        }
    }

    private void AllowAccess(final String email, final String pwd) {
        final DatabaseReference Rootref;
        Rootref = FirebaseDatabase.getInstance().getReference();

        Rootref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.child("Users").child(email).exists()){

                    Users userdata = dataSnapshot.child("Users").child(email).getValue(Users.class);
                    if(userdata.getEmail().equals(email)){
                        if(userdata.getPassword().equals(pwd)){
                            Toast.makeText(LoginActivity.this, "Logged in Successfully", Toast.LENGTH_SHORT).show();
                            progressBar.setVisibility(View.GONE);
                        }

                    }

                }else{
                    progressBar.setVisibility(View.GONE);
                    Toast.makeText(LoginActivity.this, "Account Invalid", Toast.LENGTH_SHORT).show();
                }
            }

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

            }
        });
    }

}

这是我的注册码

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Patterns;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
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 java.util.HashMap;
import java.util.regex.Pattern;

public class RegisterActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText fname,email,pswrd,cpswrd,phone;
    private static final Pattern PASSWORD_PATTERN = Pattern.compile("^" + "(?=.*[0-9])" + "(?=.*[a-z])" + "(?=.*[A-Z])" + "(?=.*[a-zA-Z])" + "(?=.*[@#$%^&+=])" + "(?=\\S+$)" + ".{8,32}" + "$");
    //private FirebaseAuth mAuth;
    ProgressBar progressBar;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        fname = (EditText) findViewById(R.id.regfname);
        email = (EditText) findViewById(R.id.regemail);
        pswrd = (EditText) findViewById(R.id.regpassword);
        cpswrd =(EditText) findViewById(R.id.regcpassword);
        phone = (EditText) findViewById(R.id.regphone);
        progressBar = (ProgressBar) findViewById(R.id.progressbar);

        findViewById(R.id.regbtn).setOnClickListener(this);

       // mAuth = FirebaseAuth.getInstance();

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.regbtn:
                createAccount();
                break;
        }

    }

    private void createAccount() {
        String name = fname.getText().toString().trim();
        String emailid = email.getText().toString().trim();
        String pwd = pswrd.getText().toString().trim();
        String cpwd = cpswrd.getText().toString().trim();
        String phoneno = phone.getText().toString().trim();

        if (name.isEmpty()) {
            fname.setError("Name Required");
            fname.requestFocus();

        }

        else if (emailid.isEmpty()) {
            email.setError("Email Required");
            email.requestFocus();

        }

        else if (!Patterns.EMAIL_ADDRESS.matcher(emailid).matches()) {
            email.setError("Enter a valid Email Address");
            email.requestFocus();

        }

        else if (pwd.isEmpty()) {
            pswrd.setError("Password Required");
            pswrd.requestFocus();

        }
        else  if (!PASSWORD_PATTERN.matcher(pwd).matches()) {
            pswrd.setError("Password should contain atleast 1 upper and lowercase, 1 special char,1 number and should be between 8-32 charcters");
            pswrd.requestFocus();

        }

        else if (cpwd.isEmpty()) {
            cpswrd.setError("Password Required");
            cpswrd.requestFocus();

        }

        else if (!pwd.equals(cpwd)) {
            cpswrd.setError("Password and Confirm Password did not match");
            cpswrd.requestFocus();

        }

        else if (phoneno.isEmpty()) {
            phone.setError("Phone Number is Required");
            phone.requestFocus();

        }

        else if (phone.length() != 10) {
            phone.setError("Enter Valid Phone Number");
            phone.requestFocus();

        }
        else{
            progressBar.setVisibility(View.VISIBLE);
            validateUser(name,emailid,pwd,phoneno);
        }


    }

    private void validateUser(final String name, final String emailid, final String pwd, final String phoneno) {

        final DatabaseReference Rootref;
        Rootref = FirebaseDatabase.getInstance().getReference();

        Rootref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(!(dataSnapshot.child("Users").child(phoneno).exists() || dataSnapshot.child("Users").child(emailid).exists())){

                    HashMap<String, Object> Userdata = new HashMap<>();
                    Userdata.put("Name", name);
                    Userdata.put("Email", emailid);
                    Userdata.put("Password", pwd);
                    Userdata.put("Phone", phoneno);

                    Rootref.child("Users").child(phoneno).updateChildren(Userdata).addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if(task.isSuccessful()){
                                Toast.makeText(RegisterActivity.this, "Congratulations, Your account has been created", Toast.LENGTH_SHORT).show();
                                progressBar.setVisibility(View.GONE);

                            }else{
                                progressBar.setVisibility(View.GONE);
                                Toast.makeText(RegisterActivity.this,"Network Error", Toast.LENGTH_SHORT).show();
                            }
                        }
                    });


                }else{

                    Toast.makeText(RegisterActivity.this, "The entered credentials are already Registered", Toast.LENGTH_SHORT).show();
                    progressBar.setVisibility(View.GONE);

                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(RegisterActivity.this, "Something went wrong", Toast.LENGTH_SHORT).show();

            }
        });

    }
}

提前致谢。

【问题讨论】:

  • 你能添加堆栈跟踪吗
  • 如果您希望我们帮助您解决崩溃问题,则必须输出 Logcat。您是否在 app 模块中正确复制了 google-services.json 文件?
  • 我已经通过 android studio 中的工具菜单同步了 firebase,所以它的 google-services.json 文件会被自动复制。如何上传stacktrace和logcat。
  • 在 Android Studio 中,您会在底部找到 logcat 选项卡。当应用程序崩溃时,您会在那里看到堆栈跟踪。复制粘贴到这里。
  • 请同时添加其他 build.gradle 文件(项目)的内容。您是否还添加了apply plugin: 'com.google.gms.google-services' 作为文件的最后一行?也请回复@AlexMamo

标签: android firebase firebase-authentication


【解决方案1】:

您在 FirebaseDatabase 尚未初始化时调用它。首先在您的 Application 类中调用 FirebaseApp.initializeApp(Context)。

public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        FirebaseApp.initializeApp(this);
    }
}

P.S.不要忘记将您的 App 类定义到 Manifest 文件中。

<application
        ...
        android:name="YOUR PATH TO App.class"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        ...>

【讨论】:

  • 我应该在哪个类中调用 FirebaseApp.initializeApp(Context)。我有 3 类,即主要、登录和注册活动。如果您不介意,请告诉我如何将应用程序类定义为清单,因为我是 android 新手。
  • @Sunil 创建 App 类,如上图所示,并添加到你的 manifest 文件中。
  • @Sunil show plz your App.class and manifest file 'application' block
  • 我在之前的回答中更新了应用程序类和清单文件。请检查一下
【解决方案2】:

最后我发现了错误是什么,它不在代码中,错误与 build.gradle 版本中的“com.google.gms:google-services”版本有关。不知道为什么,但默认情况下它是 4.1.0,当我将其更改为 4.0.1 和 4.2.0 时,它适用于我。

【讨论】:

    猜你喜欢
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多