【问题标题】:createUserWithEmailandPassword().addOnCompleteListener() won't workcreateUserWithEmailandPassword().addOnCompleteListener() 不起作用
【发布时间】:2021-01-06 23:59:26
【问题描述】:

我是使用 firebase 的新手,所以我很感激我得到的每一个帮助。我正在尝试创建登录和注册活动。当我尝试注册用户时,问题出在我的注册活动中。 createUserWithEmailandPassword() 和 addOnCompleteListener() 方法不起作用。我试图在调试器中检查它们,它从 mAuth.createUserWithEmailandPassword().addOnCompleteListener() 到函数的末尾,当我尝试运行它时,它向我显示吐司消息“注册失败!”。我想是最后的祝酒词。我该怎么办?

更新: 现在我收到消息“用户注册成功”,但我的 firebase 实时数据库和身份验证中仍然没有任何内容。

Registe Activity:

public class RegisterActivity extends AppCompatActivity {

    private EditText password, email, faculty, specialization, firstName, lastName;
    private Button signUp;
    private TextView existingUser;
    private ProgressBar progbar;
  //  private FirebaseDatabase firebaseUser;
     private FirebaseAuth mAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);
        signUp = findViewById(R.id.btnSignUp);
        existingUser = findViewById(R.id.AlreadyRegistered);
        password = findViewById(R.id.Password);
        email = findViewById(R.id.Email);
        faculty = findViewById(R.id.faculty);
        specialization = findViewById(R.id.specialization);
        firstName = findViewById(R.id.firstName);
        lastName = findViewById(R.id.lastName);
        progbar =  findViewById(R.id.progressBar);
        mAuth = FirebaseAuth.getInstance();
        //Firebase tabela user
        //Creare si inserare user Adaugare user in firebase
        //Functie de salvare in FireBase

        signUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                registerUser();
            }
        });
    }
    
    private void registerUser(){
        String emailEt = email.getText().toString().trim();
        String passwordEt = password.getText().toString().trim();
        String facultyEt = faculty.getText().toString().trim();
        String specializtionEt = specialization.getText().toString().trim();
        String firstNameEt = firstName.getText().toString().trim();
        String lastNameEt = lastName.getText().toString().trim();

//        if(firstNameEt.isEmpty())
//            Toast.makeText(this, "This field is requried!",
//                    Toast.LENGTH_SHORT).show();
//
//        if(lastNameEt.isEmpty())
//            Toast.makeText(this, "This field is requried!",
//                    Toast.LENGTH_SHORT).show();
//
//        if(passwordEt.isEmpty())
//            Toast.makeText(this, "This field is requried!",
//                    Toast.LENGTH_SHORT).show();
//
//        if(facultyEt.isEmpty())
//            Toast.makeText(this, "This field is requried!",
//                    Toast.LENGTH_SHORT).show();
//
//        if(specializtionEt.isEmpty())
//            Toast.makeText(this, "This field is requried!",
//                    Toast.LENGTH_SHORT).show();
//
//        if(emailEt.isEmpty())
//            Toast.makeText(this, "This field is requried!",
//                    Toast.LENGTH_SHORT).show();
//
//        if(!Patterns.EMAIL_ADDRESS.matcher(emailEt).matches())
//            Toast.makeText(this, "Provide a valid email",
//                    Toast.LENGTH_SHORT).show();
//
//        if(passwordEt.length() < 6)
//            Toast.makeText(this, "Password should be at least 6 characters!",
//                    Toast.LENGTH_SHORT).show();

   //     progbar.setVisibility(View.VISIBLE);
        //Verifica daca userul este deja inregistrat
        mAuth.createUserWithEmailAndPassword(emailEt, passwordEt)
                .addOnCompleteListener(RegisterActivity.this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
              if(task.isSuccessful()){
                  User user = new User(lastNameEt, firstNameEt, facultyEt, specializtionEt, emailEt, passwordEt);

                  FirebaseDatabase.getInstance().getReference("Users")
                          .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                          .setValue(user).addOnCompleteListener(new OnCompleteListener<Void>() {
                      @Override
                      public void onComplete(@NonNull Task<Void> task) {
                          if(task.isSuccessful()){
                              Toast.makeText(RegisterActivity.this,
                                       "User has been registered successfully!", Toast.LENGTH_SHORT).show();
                              progbar.setVisibility(View.GONE);
                              startActivity(new Intent(getApplicationContext(), LoginActivity.class));
                          } else{
                              Toast.makeText(RegisterActivity.this, "Faild to register!", Toast.LENGTH_SHORT).show();
                              progbar.setVisibility(View.GONE);
                          }
                      }
                  });
              } else{
                  Toast.makeText(RegisterActivity.this, "Faild to register!", Toast.LENGTH_SHORT).show();
                  progbar.setVisibility(View.GONE);
              }
            }
        });
    }
}

build.gradle(:app)

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

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "ro.ase.proiect_draft"
        minSdkVersion 26
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.2'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'com.google.firebase:firebase-database:19.5.1'
    implementation platform('com.google.firebase:firebase-bom:26.2.0')
    implementation 'com.google.firebase:firebase-analytics'
    implementation 'com.google.firebase:firebase-auth:20.0.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

    //MAterial Design
    implementation 'com.google.android.material:material:1.2.0-alpha02'

    //Rounded Image View
    implementation 'com.makeramen:roundedimageview:2.3.0'

    //Navigation Component
    implementation 'androidx.navigation:navigation-fragment-ktx:2.2.0-rc03'
    implementation 'androidx.navigation:navigation-ui-ktx:2.2.0-rc03'

    //DarkMode Theme
    implementation 'com.google.android.material:material:1.0.0'
}

【问题讨论】:

  • 我要直言不讳:永远不要将用户的未加密密码存储在您的数据库中——即使在测试期间也是如此。立即将其从您的 User 课程中删除。 Firebase 身份验证将为您安全可靠地处理密码。
  • 我建议您将“此字段为必填项!”消息更具体。目前,这些字段中的任何一个都可能丢失,您的用户不知道是哪一个。使用“需要电子邮件!”,“需要教师!”等等。

标签: android firebase firebase-realtime-database firebase-authentication


【解决方案1】:

您似乎对处理异步 API 很陌生,所以我将首先与您讨论,然后向您展示如何进一步解决此特定问题。

Firebase 身份验证(与大多数现代云一样)API 是异步的,因为它们需要调用服务器,而这可能需要一些时间。它们不会阻止代码并阻止用户与您的应用交互,而是允许主代码继续,然后在服务器调用完成后调用您的回调代码。

这就是为什么调试器“跳过”您的onComplete 调用最初,此时您只是开始调用服务器。如果您在整个代码块的关闭 } 之后放置一个 toast 或 Log.i,您会看到它马上就到了那里。

要调试异步回调,您需要在这些回调中放置一个断点,所以在 onComplete 内部的第一行。如果你这样做并让代码运行,那么当服务器调用完成时,你的断点就会被命中。此时您可以单步执行该代码。

正如一开始所说,大多数现代基于 Web/云的 API 都是基于此类异步调用,因此现在学习如何调试这些可能会对未来非常有帮助。


现在开始解决实际问题。由于对createUserWithEmailAndPassword 的调用失败,因此任务中实际上存在一个异常,您可以检查它以找出问题所在。我通常在自己的代码中抛出该异常,但您也可以将其传递给 Log.e 以在 logcat 输出中获取它。

所以:

mAuth.createUserWithEmailAndPassword(emailEt, passwordEt)
        .addOnCompleteListener(RegisterActivity.this, new OnCompleteListener<AuthResult>() {
    @Override
    public void onComplete(@NonNull Task<AuthResult> task) {
      if(task.isSuccessful()){
          User user = new User(lastNameEt, firstNameEt, facultyEt, specializtionEt, emailEt, passwordEt);

          FirebaseDatabase.getInstance().getReference("Users")
                  .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                  .setValue(user).addOnCompleteListener(new OnCompleteListener<Void>() {
              @Override
              public void onComplete(@NonNull Task<Void> task) {
                  if(task.isSuccessful()){
                      Toast.makeText(RegisterActivity.this,
                               "User has been registered successfully!", Toast.LENGTH_SHORT).show();
                      progbar.setVisibility(View.GONE);
                      startActivity(new Intent(getApplicationContext(), LoginActivity.class));
                  } else{
                      // 
                      // | | |
                      // v v v   The next two lines are changed/new
                      // 
                      Toast.makeText(RegisterActivity.this, "Failed to register: "+task.getException().getMessage()+"!", Toast.LENGTH_SHORT).show();
                      Log.e("Firebase", "Failed to register", task.getException());
                      progbar.setVisibility(View.GONE);
                  }
              }
          });
      } else{
          Toast.makeText(RegisterActivity.this, "Faild to register!", Toast.LENGTH_SHORT).show();
          progbar.setVisibility(View.GONE);
      }
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-17
    • 2017-03-16
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多