#java #android #firebase
# #java #Android #firebase
Вопрос:
ОБНОВЛЕНИЕ: Любой проект, использующий firebase, работает только на эмуляторе, я пробовал.
ПРИЛОЖЕНИЕ РАБОТАЕТ ПО НАЗНАЧЕНИЮ ТОЛЬКО В ЭМУЛЯТОРЕ
Когда я тестирую приложение на физическом устройстве, я получаю следующее. [Скриншот вывода LogCat][1]
Это вывод LogCat каждый раз, когда я нажимаю свою кнопку входа
в систему, вот мой MainActivity.java файл
package com.abg.logintest;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.android.material.textfield.TextInputEditText;
import com.google.firebase.auth.AuthResu<
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private FirebaseAuth mAuth;
TextInputEditText email,pass;
String emailText,password;
Button login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAuth = FirebaseAuth.getInstance();
email = findViewById(R.id.email);
pass = findViewById(R.id.pass);
login = findViewById(R.id.button);
login.setOnClickListener(this);
}
@Override
public void onStart() {
super.onStart();
// Check if user is signed in (non-null) and update UI accordingly.
FirebaseUser currentUser = mAuth.getCurrentUser();
updateUI(currentUser);
}
private void loginUser(String email, String password){
mAuth.signInWithEmailAndPassword(email, 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);
}
// ...
}
});
}
private void updateUI(FirebaseUser currentUser) {
if(currentUser!=null)
Log.d("login",currentUser.getEmail());
}
@Override
public void onClick(View v) {
emailText = email.getText().toString();
password = pass.getText().toString();
loginUser(emailText,password);
}
}
Вот основная деятельность XML
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="email"
android:padding="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.265">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@ id/email">
</com.google.android.material.textfield.TextInputEditText>
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@ id/textInputLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="password"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<com.google.android.material.textfield.TextInputEditText
android:id="@ id/pass"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.google.android.material.textfield.TextInputEditText>
</com.google.android.material.textfield.TextInputLayout>
<Button
android:id="@ id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Login"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@ id/textInputLayout" />
</androidx.constraintlayout.widget.ConstraintLayout>
Я включил все зависимости, необходимые для запуска firebase
[Мои зависимости на уровне модуля: ПРИЛОЖЕНИЕ][2]
[Разрешения, которые я упомянул в своем файле манифеста] [3]
Буду признателен за любую помощь, спасибо. [1]: https://i.stack.imgur.com/u8XY8.png [2]: https://i.stack.imgur.com/lIm6a.png [3]: https://i.stack.imgur.com/5kBVy.png
Ответ №1:
Итак, после изучения всего кода я обнаружил, что «new OnCompleteListener()» был выделен серым цветом, а среда IDE предложила «Анонимный новый OnCompleteListener() можно заменить на lambda»,
поэтому я заменил его на lambda
, и, что удивительно, приложение теперь работает и на реальном устройстве.
mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {....
mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(this, task -> {...
Хотя я все еще не понимаю, почему в одном проекте «new OnCompleteListener …» не был выделен серым цветом и работал нормально, но в другом проекте его нужно было заменить на лямбда-функцию.
и теперь возникает вопрос, почему приложение отлично работает на эмуляторе независимо от наличия функций lambda, и ему нужна lambda для работы на реальном устройстве.