2016-05-20 2 views
0

Wonder Почему не удается запустить mAuth.signInWithEmailAndPassword() внутри моей кнопки onClick(), как я это делал раньше. Должен ли я назвать это по-другому? но как это не так много информации о новой версии.Firebase 9.0.0 mAuth.signInWithEmailAndPassword, как передать его кнопке

В настоящее время он дает быть строка ошибки пуста или нуль:

процесса: com.example.rasmusjosefsson.rjcar, PID: 30563 java.lang.RuntimeException: Невозможно начать деятельность ComponentInfo {ком .example.rasmusjosefsson.rjcar/com.example.rasmusjosefsson.rjcar.LoginAndSignUp.LoginActivity}: java.lang.IllegalArgumentException: данная строка пуста или нуль в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2416) по адресу android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2476) на android.app.ActivityThread.-wrap11 (ActivityThread.java) в android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1344) на android.os.Handler.dispatchMessage (Handler.java:102) на android.os.Looper.loop (Looper.java:148) на android.app.ActivityThread.main (ActivityThread.java:5417) на java .lang.reflect.Method.invoke (собственный метод) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:616) Вызвано: java.lang.IllegalArgumentException: данная строка пуста или null на com.google.android.gms.common.internal. zzaa.zzdl (Unknown Source) на com.google.firebase.auth.FirebaseAuth.signInWithEmailAndPassword (Неизвестный источник) на com.example.rasmusjosefsson.rjcar.LoginAndSignUp.LoginActivity.onCreate (LoginActivity.java:77) на android.app.Activity.performCreate (Activity.java:6237) на android.app.Instrumentation.callActivityOnCreate (Instrum entation.java:1107) на android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2369) на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2476) на android.app.ActivityThread.-wrap11 (ActivityThread.java) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1344) в android.os.Handler.dispatchMessage (Handler.java:102) в android.os.Looper.loop (Looper.java:148)

Я предполагаю, что это из-за mAuth.signInWithEmailAndPassword(email, password) без какой-либо инициированной строки. и поэтому будет называться сразу внутри onCreate().

public class LoginActivity extends AppCompatActivity { 

    protected EditText emailEditText; 
    protected EditText passwordEditText; 
    protected Button loginButton; 
    protected TextView signUpTextView; 

    private FirebaseAuth mAuth; 
    private FirebaseAuth.AuthStateListener mAuthListener; 

    // Currently 
    private String email; 
    private String password; 

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


     // Setting up the Views 
     signUpTextView = (TextView) findViewById(R.id.signUpText); 
     emailEditText = (EditText) findViewById(R.id.emailField); 
     passwordEditText = (EditText) findViewById(R.id.passwordField); 
     loginButton = (Button) findViewById(R.id.loginButton); 


     // Getting the firebase reference url 
     final DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); 
     mAuth = FirebaseAuth.getInstance(); 


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

       // Reterives user inputs 
       email = emailEditText.getText().toString(); 
       password = passwordEditText.getText().toString(); 

       // trims the input 
       email = email.trim(); 
       password = password.trim(); 


      } 
     }); 


     // When a user signs in to your app, pass the user's email address and password to signInWithEmailAndPassword 
     mAuth.signInWithEmailAndPassword(email, password) 
       .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) { 
         Log.d("TAG", "signInWithEmail:onComplete:" + task.isSuccessful()); 

         // If sign in fails, display a message to the user. If sign in succeeds 
         // the auth state listener will be notified and logic to handle the 
         // signed in user can be handled in the listener. 
         if (!task.isSuccessful()) { 
          Log.w("TAG", "signInWithEmail", task.getException()); 
          Toast.makeText(LoginActivity.this, "Authentication failed.", 
            Toast.LENGTH_SHORT).show(); 
         } 
        } 
       }); 


     // responds to changes in the user's sign-in state 
     mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
       FirebaseUser user = firebaseAuth.getCurrentUser(); 
       if (user != null) { 
        // User is signed in 
        Log.d("TAG", "onAuthStateChanged:signed_in:" + user.getUid()); 

        // Authenticated successfully with authData 
        Intent intent = new Intent(LoginActivity.this, MainRealBack2.class); 
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
        startActivity(intent); 

       } else { 
        // User is signed out 
        Log.d("TAG", "onAuthStateChanged:signed_out"); 
       } 
      } 
     }; 


    } 


    @Override 
    public void onStart() { 
     super.onStart(); 
     mAuth.addAuthStateListener(mAuthListener); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     if (mAuthListener != null) { 
      mAuth.removeAuthStateListener(mAuthListener); 
     } 
    } 

} 

Моя активность:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_mainrealback2); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 


    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); 
    if (user != null) { 
     // User is signed in 
     mUserId = user.getUid(); 


    } else { 
     // No user is signed in 
     loadLoginView(); 
    } 

    waypointsUrl = Constants.FIREBASE_URL + "https://stackoverflow.com/users/" + mUserId + "/waypoints"; 
    mainRef = FirebaseDatabase.getInstance().getReferenceFromUrl(waypointsUrl); 

UPDATE

enter image description here

ответ

3

РЕШЕНИЕ

Чтобы получить .addOnCompleteListener() работу внутри setOnClickListener

.addOnCompleteListener() нужно быть объявлены с classname.this

mAuth.signInWithEmailAndPassword(email, password) 
        .addOnCompleteListener(LoginActivity.this, new OnCompleteListener<AuthResult>() { 

Окончательное решение

public class LoginActivity extends AppCompatActivity { 

protected EditText emailEditText; 
protected EditText passwordEditText; 
protected Button loginButton; 
protected TextView signUpTextView; 

private FirebaseAuth mAuth; 
private FirebaseAuth.AuthStateListener mAuthListener; 

// Currently 
private String email; 
private String password; 

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


    // Setting up the Views 
    signUpTextView = (TextView) findViewById(R.id.signUpText); 
    emailEditText = (EditText) findViewById(R.id.emailField); 
    passwordEditText = (EditText) findViewById(R.id.passwordField); 
    loginButton = (Button) findViewById(R.id.loginButton); 


    // Getting the firebase reference url 
    final DatabaseReference ref = FirebaseDatabase.getInstance().getReference(); 
    mAuth = FirebaseAuth.getInstance(); 


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

      // Reterives user inputs 
      email = emailEditText.getText().toString(); 
      password = passwordEditText.getText().toString(); 

      // trims the input 
      email = email.trim(); 
      password = password.trim(); 


    // When a user signs in to your app, pass the user's email address and password to signInWithEmailAndPassword 
    mAuth.signInWithEmailAndPassword(email, password) 
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        Log.d("TAG", "signInWithEmail:onComplete:" + task.isSuccessful()); 

        // If sign in fails, display a message to the user. If sign in succeeds 
        // the auth state listener will be notified and logic to handle the 
        // signed in user can be handled in the listener. 
        if (!task.isSuccessful()) { 
         Log.w("TAG", "signInWithEmail", task.getException()); 
         Toast.makeText(LoginActivity.this, "Authentication failed.", 
           Toast.LENGTH_SHORT).show(); 
        } 
       } 
      }); 


     } 
    }); 





    // responds to changes in the user's sign-in state 
    mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      FirebaseUser user = firebaseAuth.getCurrentUser(); 
      if (user != null) { 
       // User is signed in 
       Log.d("TAG", "onAuthStateChanged:signed_in:" + user.getUid()); 

       // Authenticated successfully with authData 
       Intent intent = new Intent(LoginActivity.this, MainRealBack2.class); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
       startActivity(intent); 

      } else { 
       // User is signed out 
       Log.d("TAG", "onAuthStateChanged:signed_out"); 
      } 
     } 
    }; 


} 


@Override 
public void onStart() { 
    super.onStart(); 
    mAuth.addAuthStateListener(mAuthListener); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    if (mAuthListener != null) { 
     mAuth.removeAuthStateListener(mAuthListener); 
    } 
} 

} 
+0

Любые причины, почему это делается? – tenki

+0

@Rasmus Просто сомневаюсь. Incase LoginActivity должен возвращать результат с помощью setResult() в свою родительскую активность, как я могу сделать это в методе onComplete? Я пробовал все возможные способы, но setResult не смог вызвать onActivityResult своего родителя. – Tamil

-1

Вы звоните mAuth.signInWithEmailAndPassword() внутри OnCreate() сразу. Вам нужно переместить его в свой onClickListener.

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

      // Reterives user inputs 
      email = emailEditText.getText().toString(); 
      password = passwordEditText.getText().toString(); 

      // trims the input 
      email = email.trim(); 
      password = password.trim(); 

      mAuth.signInWithEmailAndPassword(email, password) 
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        Log.d("TAG", "signInWithEmail:onComplete:" + task.isSuccessful()); 

        // If sign in fails, display a message to the user. If sign in succeeds 
        // the auth state listener will be notified and logic to handle the 
        // signed in user can be handled in the listener. 
        if (!task.isSuccessful()) { 
         Log.w("TAG", "signInWithEmail", task.getException()); 
         Toast.makeText(LoginActivity.this, "Authentication failed.", 
           Toast.LENGTH_SHORT).show(); 
        } 
       } 
      }); 

     } 
    }); 
+0

Я пробовал, но получил ошибку. Проверьте обновленное изображение –

+0

@RasmusRajjeJosefsson Попробуйте изменить свою авторизацию в соответствии с руководством по firebase https://www.firebase.com/docs/android/guide/user-auth.html Под хранением userdata –

+0

Работает ли оно со старой firebase? Выполняли следующее руководство https://firebase.google.com/docs/auth/android/password-auth#create_a_password-based_account –

Смежные вопросы