您好,我知道有重复的内容,例如(Firebase Registration, Given String is empty or null和(I keep getting"java.lang.IllegalArgumentException: Given String is empty or null" and it has something to do with auth = FirebaseAuth.getInstance();")。
这两篇文章都提到了有关api_key的解决方案。我已经检查了我的地雷,它们已经存在,所以我坚信它不再是这个原因。因此,我进行了进一步研究,发现需要检查一些内容是否为空,所以我得到了(Check whether a string is not null and not empty)和(Checking if a string is empty or null in Java)。
我确实尝试了他们的解决方案,但无济于事-我仍然遇到上述错误。我使用自己的直觉和给出的指南对其进行了编码,但是我仍然不确定是否正确。就像错误一样,无论错误是代码本身还是我错误地放置了它们。
有人可以帮助我检查并提供指导,以便我纠正错误吗? 注意:我正在使用Firebase进行身份验证。
下面是我的代码:
package com.example.run_h.boav2;
import android.app.ProgressDialog;
import android.content.Intent;
import android.hardware.usb.UsbRequest;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
public class MainActivity extends AppCompatActivity {
private EditText Username;
private EditText Password;
private TextView Info;
private Button Login;
private int counter = 3;
private Button userRegistration;
private FirebaseAuth firebaseAuth;
private ProgressDialog progressDialog;
private TextView forgotPassword;
String name, password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Username = (EditText)findViewById(R.id.etUsername);
Password = (EditText)findViewById(R.id.etPassword);
Info = (TextView)findViewById(R.id.tvInfo);
Login = (Button)findViewById(R.id.btnLogin);
userRegistration = (Button)
findViewById(R.id.tvRegister);
forgotPassword =
(TextView)findViewById(R.id.tvForgotPassword);
Info.setText("# of Attempts Left: 3");
firebaseAuth = FirebaseAuth.getInstance();
FirebaseUser user = firebaseAuth.getCurrentUser();
progressDialog = new ProgressDialog(this);
//user has logged in and never once logged out. auto
bring to the secondactivity (dashboard) page.
if(user != null){
finish();
startActivity(new Intent(MainActivity.this,
SecondActivity.class));
}
Login.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view) {
validate(Username.getText().toString(),
Password.getText().toString());
}
});
userRegistration.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this,
RegistrationActivity.class));
}
});
forgotPassword.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(MainActivity.this,
PasswordActivity.class ));
}
});
}
private void validate(String userName, String
userPassword){
progressDialog.setMessage("Please hold on. We are
testing your patience!");
progressDialog.setProgressStyle(progressDialog.STYLE_SPINNER);
progressDialog.show();
firebaseAuth.signInWithEmailAndPassword(userName,
userPassword).addOnCompleteListener(new
OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult>
task) {
if(task.isSuccessful()){
progressDialog.dismiss();
checkEmailVerification();
}
else{
//Toast.makeText(MainActivity.this, "Login failed.
Incorrect username or password. Please try again.",
Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
checkEmptyCredentials();
counter--;
Info.setText("# of Attempts Left: " + counter);
if(counter == 0){
Login.setEnabled(false);
startActivity(new Intent(MainActivity.this, PasswordActivity.class)); //forces user to reset password
}
}
}
});
}
private Boolean checkEmptyCredentials(){
Boolean result = false;
name = Username.getText().toString();
password = Password.getText().toString();
if(name != null && name.isEmpty() || password != null && password.isEmpty()){
Toast.makeText(this, "All fields must not be blank.", Toast.LENGTH_SHORT).show();
}else{
result = true;
}
return result;
}
private void checkEmailVerification(){
FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
Boolean emailflag = firebaseUser.isEmailVerified();
if(emailflag){
finish();
startActivity(new Intent(MainActivity.this, Main2Activity.class));
}else{
Toast.makeText(this, "Please verify your email and account to login.", Toast.LENGTH_SHORT).show();
firebaseAuth.signOut();
}
}
}
错误跟踪
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.run_h.boav2, PID: 27092
java.lang.IllegalArgumentException: Given String is empty or null
at com.google.android.gms.common.internal.Preconditions.checkNotEmpty(Unknown Source)
at com.google.firebase.auth.FirebaseAuth.signInWithEmailAndPassword(Unknown Source)
at com.example.run_h.boav2.MainActivity.validate(MainActivity.java:89)
at com.example.run_h.boav2.MainActivity.access$200(MainActivity.java:21)
at com.example.run_h.boav2.MainActivity$1.onClick(MainActivity.java:64)
at android.view.View.performClick(View.java:5697)
at android.widget.TextView.performClick(TextView.java:10814)
at android.view.View$PerformClick.run(View.java:22526)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7229)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
答案 0 :(得分:0)
请注意getText()
。您需要检查getText()
的结果,而不是随后的toString()
的结果:
CharSequence text = someEditText.getText();
if (text == null) {
//do what you do when the text is null or empty
}
String stringText = text.toString();
if (stringText.isEmpty()) {
//do what you do when the text is null or empty
}
这是因为无论出于何种原因,如果getText()
为null
,则在EditText实例本身上调用toString()
,这将返回EditText的完整类名以及该实例的哈希码
此外,您应该在调用checkEmptyCredentials()
之前调用validate()
的结果 ,而不是尝试登录后的之后。这很可能是导致崩溃的原因,而以上内容将解决您尚未遇到的错误。
答案 1 :(得分:0)
firebaseAuth.signInWithEmailAndPassword
函数不允许使用null或空白文本。因此,您必须确保这些字段不是null也不为空。
为便于检查,我建议您使用此类https://developer.android.com/reference/android/text/TextUtils。它具有函数isEmpty()
,可以在一次调用中检查是否为空。
private void validate(String userName, String userPassword){
if (TextUtils.isEmpty(userName)) return; // userName null or empty. We do not process it.
if (TextUtils.isEmpty(userPassword)) return; // userPassword null or empty. We do not process it.
progressDialog.setMessage("Please hold on. We are
testing your patience!");
progressDialog.setProgressStyle(progressDialog.STYLE_SPINNER);
progressDialog.show();
firebaseAuth.signInWithEmailAndPassword(userName,
userPassword).addOnCompleteListener(new
OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult>
task) {
if(task.isSuccessful()){
progressDialog.dismiss();
checkEmailVerification();
}
else{
//Toast.makeText(MainActivity.this, "Login failed.
Incorrect username or password. Please try again.",
Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
//checkEmptyCredentials(); //We need to check before signin. So you can replace my code lines above with this function.
counter--;
Info.setText("# of Attempts Left: " + counter);
if(counter == 0){
Login.setEnabled(false);
startActivity(new Intent(MainActivity.this, PasswordActivity.class)); //forces user to reset password
}
}
}
});
}
答案 2 :(得分:0)
if (!password.getText().toString().isEmpty()&&!email.getText().toString().isEmpty()) {
firebaseAuth.signInWithEmailAndPassword(name, password).addOnCompleteListener(Login.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()) {
// there was an error
Toast.makeText(Login.this, "Something Went wrong", Toast.LENGTH_SHORT).show();
} else {
checkEmailVerification();
} }
});
}
} else {
Toast.makeText(this, "All fields must not be blank.", Toast.LENGTH_SHORT).show();
}