首页 > 解决方案 > Firebase 身份验证 createUserWithEmailAndPassword 在具有电子邮件变量的物理设备上失败

问题描述

使用 createUserWithEmailAndPassword 时有两个问题,

  1. 它适用于模拟器,但不适用于物理设备的调试模式

  2. 为了让它在物理设备上工作,我可以为电子邮件部分硬编码一个字符串,即使它被保存到一个变量中。从 EditText 获取电子邮件时它会中断,但我使用 Log.d() 在调用创建方法之前确认字符串完全相同。

这有效

    final String sEmail = "ExampleEmail@gmail.com";
            final String sPassword = password.getText().toString();
            final String sDisplayName = displayName.getText().toString();
            Log.d("Credentials:Email", sEmail);
            Log.d("Credentials:Password", sPassword);
            mAuth.createUserWithEmailAndPassword(sEmail,sPassword).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()){
                        FirebaseUser user = mAuth.getCurrentUser();
                        /*UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                                .setDisplayName(sDisplayName).build();
                        user.updateProfile(profileUpdates);
                        mAuth.signOut();*/
                        Intent intent = new Intent(MainActivity.this,UserLogin.class);
                        startActivity(intent);

                    }else{
                        Toast creationFailed = Toast.makeText(getApplicationContext(),"Creation Failed", Toast.LENGTH_SHORT);
                        creationFailed.show();
                    }

                }
            });

这没有。

    final String sEmail = email.getText().toString();
            final String sPassword = password.getText().toString();
            final String sDisplayName = displayName.getText().toString();
            Log.d("Credentials:Email", sEmail);
            Log.d("Credentials:Password", sPassword);
            mAuth.createUserWithEmailAndPassword(sEmail,sPassword).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()){
                        FirebaseUser user = mAuth.getCurrentUser();
                        /*UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                                .setDisplayName(sDisplayName).build();
                        user.updateProfile(profileUpdates);
                        mAuth.signOut();*/
                        Intent intent = new Intent(MainActivity.this,UserLogin.class);
                        startActivity(intent);

                    }else{
                        Toast creationFailed = Toast.makeText(getApplicationContext(),"Creation Failed", Toast.LENGTH_SHORT);
                        creationFailed.show();
                    }

                }
            });

这是错误消息

    2019-01-14 13:44:48.298 3217-16541/? E/Volley: [1455] BasicNetwork.performRequest: Unexpected response code 400 for https://www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser?alt=proto&key=AIzaSyCTfahJaTfOSAOdY7_pIN27-BGQgFlORnE

请注意,由于某种原因,第二个不起作用的将在模拟设备上工作。我希望第二个创建帐户,但它失败了。

标签: javaandroidfirebasefirebase-authentication

解决方案


我假设您的输入不是电子邮件类型。请记住,它需要电子邮件类型。

制定一种检查电子邮件有效的方法

   //Check email valid
    boolean isEmailValid(CharSequence email) {
        return android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
    }

然后适用于你的部分。

        //Check email valid
        if (!isEmailValid(email.getText().toString())) {
            email.setError("Not email type");
            email.requestFocus();
            return;
        }

关于你的吐司,也许你这样放会更好。所以,你可以知道你遇到了什么错误。

else {             
      Toast.makeText(getApplicationContext(), "Fail: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
      }

推荐阅读