Android Studio中的Firebase身份验证代码会导致应用崩溃,但我没有错误

时间:2017-06-13 16:36:50

标签: android firebase firebase-authentication

我正在尝试制作应用,并希望使用Firebase身份验证来简化操作。我编写了我的代码,我将放在下面,似乎没有明显的错误,但应用程序在启动时崩溃,甚至不让我访问第一个活动

public class MainActivity extends AppCompatActivity {

//all variables and layout elements

    private static final String TAG = "EmailPassword";

    private FirebaseAuth mAuth;
    Button logIn;
    Button changeElements;
    EditText userName;
    EditText passWord;
    EditText passWordCheck;
    TextView text;
    TextView confirmPassword;

    String username;
    String password;
    String passwordCheck;

    boolean hasAccount=false;


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

        //match variables wwith layout elements

        mAuth = FirebaseAuth.getInstance();

        logIn = (Button) findViewById(R.id.login);
        changeElements = (Button) findViewById(R.id.change_elements);
        userName = (EditText) findViewById(R.id.user);
        passWord = (EditText) findViewById(R.id.password);
        text = (TextView) findViewById(R.id.textView5);
        confirmPassword = (TextView) findViewById(R.id.textView3);


        //change between login and register
        changeElements.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (hasAccount){
                    hasAccount = false;
                    confirmPassword.setVisibility(View.VISIBLE);
                    passWordCheck.setVisibility(View.VISIBLE);

                    logIn.setText("Register");
                    changeElements.setText("Log In");
                    text.setText("Already have an account?");
                }else{
                    hasAccount = true;
                    confirmPassword.setVisibility(View.INVISIBLE);
                    passWordCheck.setVisibility(View.INVISIBLE);

                    logIn.setText("Log In");
                    changeElements.setText("Register");
                    text.setText("Don't have an account? Register here");
                }
            }
        });


        //if log-in or register button is clicked
        logIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                username = userName.toString();
                password = passWord.toString();


                //to login, 
                if (hasAccount){

                    signIn(username, password);

                }else{

                if(password!= null && !password.isEmpty()&& username!= null && !username.isEmpty() && password==passwordCheck){
                    //if password and username fields are not empty and the confirmed password matches, create account
                    userAuth(username,password);
                }else if(password!=passwordCheck){
                    passWordCheck.setError("Passwords do not match");
                }else if(username.isEmpty()||username == null){
                    userName.setError("Please enter username");
                }
                else if(password.isEmpty()||password == null){
                    passWord.setError("Please enter password");
                }


                    }
            }
        });




    }

    @Override
    protected void onStart() {
        super.onStart();
        //Check to see if user is signed in, this is firebase code
        FirebaseUser currentUser = mAuth.getCurrentUser();
        updateUi(currentUser);

    }

    public void updateUi (FirebaseUser user){

        if(user!=null){

            //if user, go to next activity

            Intent intent = new Intent(this, Parties.class);
            startActivity(intent);

        }else{

            //if no user, stay on page, clear fields and display error message


            userName.setError("Something went wrong. Please try again");
            userName.setText("");
            passWord.setText("");
            passWordCheck.setText("");


        }


    }


    //just put the firebase create user code in a method
    public void userAuth(String username, String password){
        mAuth.createUserWithEmailAndPassword(username,password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()){
                    Log.d(TAG, "createUserWithEmailSucces");
                    FirebaseUser user = mAuth.getCurrentUser();
                    updateUi(user);

                }
                else {
                    Log.w(TAG,"createUserWithEmailFailure");
                    Toast.makeText(MainActivity.this, "Authentification failed", Toast.LENGTH_SHORT).show();
                    updateUi(null);
                }
            }
        });

    }


    //same thing here for the sign in

    public void signIn(String username,String password){
        mAuth.signInWithEmailAndPassword(username, password)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            // Sign in success, update UI with the signed-in user's information
                            Log.d(TAG, "signInWithEmail:success");
                            FirebaseUser user = mAuth.getCurrentUser();
                            updateUi(user);
                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w(TAG, "signInWithEmail:failure", task.getException());
                            Toast.makeText(MainActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                            updateUi(null);
                        }


                    }
                });
    }

}

这是我的logcat

**

06-13 17:45:45.864 2366-2366/? I/art: Not late-enabling -Xcheck:jni (already on)
06-13 17:45:45.864 2366-2366/? W/art: Unexpected CPU variant for X86 using defaults: x86
06-13 17:45:45.970 2366-2366/com.example.eliott.proto_onrop W/System: ClassLoader referenced unknown path: /data/app/com.example.eliott.proto_onrop-2/lib/x86
06-13 17:45:46.037 2366-2366/com.example.eliott.proto_onrop D/FirebaseApp: com.google.firebase.crash.FirebaseCrash is not linked. Skipping initialization.
06-13 17:45:46.056 2366-2388/com.example.eliott.proto_onrop W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found.
06-13 17:45:46.063 2366-2366/com.example.eliott.proto_onrop I/FA: App measurement is starting up, version: 11010
06-13 17:45:46.063 2366-2366/com.example.eliott.proto_onrop I/FA: To enable debug logging run: adb shell setprop log.tag.FA VERBOSE
06-13 17:45:46.064 2366-2388/com.example.eliott.proto_onrop W/GooglePlayServicesUtil: Google Play services out of date.  Requires 11010000 but found 10298470
06-13 17:45:46.073 2366-2366/com.example.eliott.proto_onrop V/FA: Collection enabled
06-13 17:45:46.073 2366-2366/com.example.eliott.proto_onrop V/FA: App package, google app id: com.example.eliott.proto_onrop, 1:95710228681:android:5771a0cac4b901a2
06-13 17:45:46.074 2366-2366/com.example.eliott.proto_onrop I/FA: To enable faster debug mode event logging run:
                                                                    adb shell setprop debug.firebase.analytics.app com.example.eliott.proto_onrop
06-13 17:45:46.074 2366-2366/com.example.eliott.proto_onrop D/FA: Debug-level message logging enabled
06-13 17:45:46.095 2366-2366/com.example.eliott.proto_onrop V/FA: Cancelling job. JobID: 653780905
06-13 17:45:46.101 2366-2366/com.example.eliott.proto_onrop V/FA: Registered activity lifecycle callback
06-13 17:45:46.102 2366-2366/com.example.eliott.proto_onrop I/FirebaseInitProvider: FirebaseApp initialization successful
06-13 17:45:46.102 2366-2366/com.example.eliott.proto_onrop I/InstantRun: starting instant run server: is main process
06-13 17:45:46.106 2366-2393/com.example.eliott.proto_onrop V/FA: Using measurement service
06-13 17:45:46.107 2366-2393/com.example.eliott.proto_onrop V/FA: Connecting to remote service
06-13 17:45:46.107 2366-2393/com.example.eliott.proto_onrop W/GooglePlayServicesUtil: Google Play services out of date.  Requires 11010000 but found 10298470
06-13 17:45:46.108 2366-2393/com.example.eliott.proto_onrop V/FA: Using measurement service
06-13 17:45:46.108 2366-2393/com.example.eliott.proto_onrop V/FA: Connection attempt already in progress
06-13 17:45:46.184 2366-2366/com.example.eliott.proto_onrop W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
06-13 17:45:46.189 2366-2366/com.example.eliott.proto_onrop V/FA: onActivityCreated
06-13 17:45:46.248 2366-2366/com.example.eliott.proto_onrop D/AndroidRuntime: Shutting down VM


                                                                              --------- beginning of crash
06-13 17:45:46.248 2366-2366/com.example.eliott.proto_onrop E/AndroidRuntime: FATAL EXCEPTION: main
                                                                              Process: com.example.eliott.proto_onrop, PID: 2366
                                                                              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.eliott.proto_onrop/com.example.eliott.proto_onrop.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
                                                                                  at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                  at android.os.Looper.loop(Looper.java:154)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
                                                                               Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.EditText.setText(java.lang.CharSequence)' on a null object reference
                                                                                  at com.example.eliott.proto_onrop.MainActivity.updateUi(MainActivity.java:151)
                                                                                  at com.example.eliott.proto_onrop.MainActivity.onStart(MainActivity.java:130)
                                                                                  at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1248)
                                                                                  at android.app.Activity.performStart(Activity.java:6679)
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2609)
                                                                                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 
                                                                                  at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                                                                                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                  at android.os.Looper.loop(Looper.java:154) 
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:6077) 
                                                                                  at java.lang.reflect.Method.invoke(Native Method) 
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

**

这些是我的build.gradle文件,即项目

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.google.gms:google-services:3.1.0'


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

和模块

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "com.example.eliott.proto_onrop"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    testCompile 'junit:junit:4.12'

    compile 'com.google.firebase:firebase-database:11.0.0'
    compile 'com.google.firebase:firebase-core:11.0.0'
    compile 'com.google.firebase:firebase-auth:11.0.0'


}

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

1 个答案:

答案 0 :(得分:0)

由于空指针异常!!!此强制关闭!!!

在MainActivity中 - 检查登录按钮的OnClickListener

}else if(password!=passwordCheck){
  

passWordCheck.setError(&#34;密码不匹配&#34;);

                }else if(username.isEmpty()||username == null){

您是否在OnCreate中引用了 EditText passWordCheck 的ID?