Java 带有Firebase错误的FlashChat
我正在尝试使用Firebase从“课程”构建一个flash聊天应用程序,但我一直在这个问题上陷入困境。非常感谢您的帮助。我也将发布我的应用程序Gradle文件。讲师可能正在使用一个过时的Android Studio,并且可能在Gradle文件中使用了旧的依赖项,因此在研究之后,我决定更改它,但它仍然不起作用。请帮助我完成这门课程。谢谢Java 带有Firebase错误的FlashChat,java,android,database,firebase,login,Java,Android,Database,Firebase,Login,我正在尝试使用Firebase从“课程”构建一个flash聊天应用程序,但我一直在这个问题上陷入困境。非常感谢您的帮助。我也将发布我的应用程序Gradle文件。讲师可能正在使用一个过时的Android Studio,并且可能在Gradle文件中使用了旧的依赖项,因此在研究之后,我决定更改它,但它仍然不起作用。请帮助我完成这门课程。谢谢 05-09 09:17:44.777 2668-2668/com.lucianvibez.flashchatnewfirebase E/AndroidRuntim
05-09 09:17:44.777 2668-2668/com.lucianvibez.flashchatnewfirebase E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.lucianvibez.flashchatnewfirebase, PID: 2668
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.lucianvibez.flashchatnewfirebase/com.online.lucianvibez.flashchatnewfirebase.LoginActivity}: java.lang.ClassNotFoundException: Didn't find class "com.online.lucianvibez.flashchatnewfirebase.LoginActivity" on path: DexPathList[[zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/base.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_dependencies_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_0_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_1_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_2_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_3_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_4_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_5_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_6_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_7_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_8_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.lucianvibez.flashchatnewfirebase-1/lib/x86, /system/lib, /vendor/lib]]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2548)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.online.lucianvibez.flashchatnewfirebase.LoginActivity" on path: DexPathList[[zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/base.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_dependencies_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_0_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_1_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_2_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_3_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_4_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_5_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_6_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_7_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_8_apk.apk", zip file "/data/app/com.lucianvibez.flashchatnewfirebase-1/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.lucianvibez.flashchatnewfirebase-1/lib/x86, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.app.Instrumentation.newActivity(Instrumentation.java:1078)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2538)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
05-09 09:18:15.891 2668-2761/com.lucianvibez.flashchatnewfirebase
E/FirebaseInstanceId: Token retrieval failed: SERVICE_NOT_AVAILABLE
05-09 09:19:15.958 2668-2761/com.lucianvibez.flashchatnewfirebase
E/FirebaseInstanceId: Token retrieval failed: SERVICE_NOT_AVAILABLE
05-09 09:20:45.975 2668-2761/com.lucianvibez.flashchatnewfirebase
E/FirebaseInstanceId: Token retrieval failed: SERVICE_NOT_AVAILABLE
下面是我的应用程序等级文件:
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.lucianvibez.flashchatnewfirebase"
minSdkVersion 16
targetSdkVersion 27
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
implementation 'com.android.support:appcompat-v7:27.0.2'
implementation 'com.android.support:design:27.0.2'
implementation 'com.google.firebase:firebase-core:15.0.0'
implementation 'com.google.firebase:firebase-database:15.0.1'
implementation 'com.google.firebase:firebase-auth:15.1.0'
implementation 'com.google.android.gms:play-services-auth:15.0.0'
}
apply plugin: 'com.google.gms.google-services'
LoginActivity.java
package com.lucianvibez.flashchatnewfirebase;
public class LoginActivity extends AppCompatActivity {
// TODO: Add member variables here:
// UI references.
private AutoCompleteTextView mEmailView;
private EditText mPasswordView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mEmailView = (AutoCompleteTextView) findViewById(R.id.login_email);
mPasswordView = (EditText) findViewById(R.id.login_password);
mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
if (id == R.integer.login || id == EditorInfo.IME_NULL) {
attemptLogin();
return true;
}
return false;
}
});
// TODO: Grab an instance of FirebaseAuth
}
// Executed when Sign in button pressed
public void signInExistingUser(View v) {
// TODO: Call attemptLogin() here
}
// Executed when Register button pressed
public void registerNewUser(View v) {
Intent intent = new Intent(this, com.lucianvibez.flashchatnewfirebase.RegisterActivity.class);
finish();
startActivity(intent);
}
// TODO: Complete the attemptLogin() method
private void attemptLogin() {
// TODO: Use FirebaseAuth to sign in with email & password
}
// TODO: Show error on screen with an alert dialog
package com.lucianvibez.flashchatnewfirebase;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.TextView;
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;
public class RegisterActivity extends AppCompatActivity {
// Constants
public static final String CHAT_PREFS = "ChatPrefs";
public static final String DISPLAY_NAME_KEY = "username";
// TODO: Add member variables here:
// UI references.
private AutoCompleteTextView mEmailView;
private AutoCompleteTextView mUsernameView;
private EditText mPasswordView;
private EditText mConfirmPasswordView;
// Firebase instance variables
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
mEmailView = (AutoCompleteTextView) findViewById(R.id.register_email);
mPasswordView = (EditText) findViewById(R.id.register_password);
mConfirmPasswordView = (EditText) findViewById(R.id.register_confirm_password);
mUsernameView = (AutoCompleteTextView) findViewById(R.id.register_username);
// Keyboard sign in action
mConfirmPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
if (id == R.integer.register_form_finished || id == EditorInfo.IME_NULL) {
attemptRegistration();
return true;
}
return false;
}
});
// TODO: Get hold of an instance of FirebaseAuth
mAuth = FirebaseAuth.getInstance();
}
// Executed when Sign Up button is pressed.
public void signUp(View v) {
attemptRegistration();
}
private void attemptRegistration() {
// Reset errors displayed in the form.
mEmailView.setError(null);
mPasswordView.setError(null);
// Store values at the time of the login attempt.
String email = mEmailView.getText().toString();
String password = mPasswordView.getText().toString();
boolean cancel = false;
View focusView = null;
// Check for a valid password, if the user entered one.
if (TextUtils.isEmpty(password) || !isPasswordValid(password)) {
mPasswordView.setError(getString(R.string.error_invalid_password));
focusView = mPasswordView;
cancel = true;
}
// Check for a valid email address.
if (TextUtils.isEmpty(email)) {
mEmailView.setError(getString(R.string.error_field_required));
focusView = mEmailView;
cancel = true;
} else if (!isEmailValid(email)) {
mEmailView.setError(getString(R.string.error_invalid_email));
focusView = mEmailView;
cancel = true;
}
if (cancel) {
// There was an error; don't attempt login and focus the first
// form field with an error.
focusView.requestFocus();
} else {
// TODO: Call create FirebaseUser() here
createFirebaseUser();
}
}
private boolean isEmailValid(String email) {
// You can add more checking logic here.
return email.contains("@");
}
private boolean isPasswordValid(String password) {
//TODO: Add own logic to check for a valid password (minimum 6 characters)
String confirmPassword = mConfirmPasswordView.getText().toString();
return confirmPassword.equals(password) && password.length() > 4;
}
// TODO: Create a Firebase user
private void createFirebaseUser(){
String email = mEmailView.getText().toString();
String password = mPasswordView.getText().toString();
mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d("FlashChat", "createUser onComplete: " + task.isSuccessful());
if (!task.isSuccessful()){
Log.d("FlashChat", "user creation failed");
}
}
});
}
// TODO: Save the display name to Shared Preferences
// TODO: Create an alert dialog to show in case registration failed
}
RegisterActivity.java
package com.lucianvibez.flashchatnewfirebase;
public class LoginActivity extends AppCompatActivity {
// TODO: Add member variables here:
// UI references.
private AutoCompleteTextView mEmailView;
private EditText mPasswordView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mEmailView = (AutoCompleteTextView) findViewById(R.id.login_email);
mPasswordView = (EditText) findViewById(R.id.login_password);
mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
if (id == R.integer.login || id == EditorInfo.IME_NULL) {
attemptLogin();
return true;
}
return false;
}
});
// TODO: Grab an instance of FirebaseAuth
}
// Executed when Sign in button pressed
public void signInExistingUser(View v) {
// TODO: Call attemptLogin() here
}
// Executed when Register button pressed
public void registerNewUser(View v) {
Intent intent = new Intent(this, com.lucianvibez.flashchatnewfirebase.RegisterActivity.class);
finish();
startActivity(intent);
}
// TODO: Complete the attemptLogin() method
private void attemptLogin() {
// TODO: Use FirebaseAuth to sign in with email & password
}
// TODO: Show error on screen with an alert dialog
package com.lucianvibez.flashchatnewfirebase;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.TextView;
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;
public class RegisterActivity extends AppCompatActivity {
// Constants
public static final String CHAT_PREFS = "ChatPrefs";
public static final String DISPLAY_NAME_KEY = "username";
// TODO: Add member variables here:
// UI references.
private AutoCompleteTextView mEmailView;
private AutoCompleteTextView mUsernameView;
private EditText mPasswordView;
private EditText mConfirmPasswordView;
// Firebase instance variables
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
mEmailView = (AutoCompleteTextView) findViewById(R.id.register_email);
mPasswordView = (EditText) findViewById(R.id.register_password);
mConfirmPasswordView = (EditText) findViewById(R.id.register_confirm_password);
mUsernameView = (AutoCompleteTextView) findViewById(R.id.register_username);
// Keyboard sign in action
mConfirmPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
if (id == R.integer.register_form_finished || id == EditorInfo.IME_NULL) {
attemptRegistration();
return true;
}
return false;
}
});
// TODO: Get hold of an instance of FirebaseAuth
mAuth = FirebaseAuth.getInstance();
}
// Executed when Sign Up button is pressed.
public void signUp(View v) {
attemptRegistration();
}
private void attemptRegistration() {
// Reset errors displayed in the form.
mEmailView.setError(null);
mPasswordView.setError(null);
// Store values at the time of the login attempt.
String email = mEmailView.getText().toString();
String password = mPasswordView.getText().toString();
boolean cancel = false;
View focusView = null;
// Check for a valid password, if the user entered one.
if (TextUtils.isEmpty(password) || !isPasswordValid(password)) {
mPasswordView.setError(getString(R.string.error_invalid_password));
focusView = mPasswordView;
cancel = true;
}
// Check for a valid email address.
if (TextUtils.isEmpty(email)) {
mEmailView.setError(getString(R.string.error_field_required));
focusView = mEmailView;
cancel = true;
} else if (!isEmailValid(email)) {
mEmailView.setError(getString(R.string.error_invalid_email));
focusView = mEmailView;
cancel = true;
}
if (cancel) {
// There was an error; don't attempt login and focus the first
// form field with an error.
focusView.requestFocus();
} else {
// TODO: Call create FirebaseUser() here
createFirebaseUser();
}
}
private boolean isEmailValid(String email) {
// You can add more checking logic here.
return email.contains("@");
}
private boolean isPasswordValid(String password) {
//TODO: Add own logic to check for a valid password (minimum 6 characters)
String confirmPassword = mConfirmPasswordView.getText().toString();
return confirmPassword.equals(password) && password.length() > 4;
}
// TODO: Create a Firebase user
private void createFirebaseUser(){
String email = mEmailView.getText().toString();
String password = mPasswordView.getText().toString();
mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d("FlashChat", "createUser onComplete: " + task.isSuccessful());
if (!task.isSuccessful()){
Log.d("FlashChat", "user creation failed");
}
}
});
}
// TODO: Save the display name to Shared Preferences
// TODO: Create an alert dialog to show in case registration failed
}
package com.lucianvibez.flashchatnewfirebase;
导入android.os.Bundle;
导入android.support.annotation.NonNull;
导入android.support.v7.app.AppActivity;
导入android.text.TextUtils;
导入android.util.Log;
导入android.view.KeyEvent;
导入android.view.view;
导入android.view.inputmethod.EditorInfo;
导入android.widget.AutoCompleteTextView;
导入android.widget.EditText;
导入android.widget.TextView;
导入com.google.android.gms.tasks.OnCompleteListener;
导入com.google.android.gms.tasks.Task;
导入com.google.firebase.auth.AuthResult;
导入com.google.firebase.auth.FirebaseAuth;
公共类注册活动扩展了AppCompatActivity{
//常数
公共静态最终字符串CHAT\u PREFS=“ChatPrefs”;
公共静态最终字符串显示\u NAME\u KEY=“username”;
//TODO:在此处添加成员变量:
//用户界面引用。
私有AutoCompleteTextView mEmailView;
私有自动完成文本视图mUsernameView;
私有编辑文本mPasswordView;
私有EditText mConfirmPasswordView;
//Firebase实例变量
私人消防队;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u寄存器);
mEmailView=(AutoCompleteTextView)findviewbyd(R.id.register\u email);
mPasswordView=(EditText)findViewById(R.id.register\u密码);
mConfirmPasswordView=(EditText)findViewById(R.id.register\u confirm\u password);
mUsernameView=(AutoCompleteTextView)findViewById(R.id.register\u用户名);
//键盘登录操作
mConfirmPasswordView.setOnEditorActionListener(新的TextView.OnEditorActionListener(){
@凌驾
公共布尔onEditorAction(TextView TextView、int id、KeyEvent KeyEvent){
if(id==R.integer.register_form_finished | | id==EditorInfo.IME_NULL){
尝试注册();
返回true;
}
返回false;
}
});
//TODO:获取FirebaseAuth的实例
mAuth=FirebaseAuth.getInstance();
}
//按下“注册”按钮时执行。
公共无效注册(视图五){
尝试注册();
}
私有无效注册(){
//重置表单中显示的错误。
mEmailView.setError(null);
mPasswordView.setError(null);
//在尝试登录时存储值。
字符串email=mEmailView.getText().toString();
字符串密码=mPasswordView.getText().toString();
布尔取消=假;
视图焦点视图=空;
//如果用户输入了有效密码,请检查密码是否有效。
if(TextUtils.isEmpty(密码)| |!isPasswordValid(密码)){
mPasswordView.setError(getString(R.string.error\u密码无效));
focusView=mPasswordView;
取消=真;
}
//检查有效的电子邮件地址。
如果(TextUtils.isEmpty(电子邮件)){
setError(getString(R.string.error_字段_必填));
focusView=mEmailView;
取消=真;
}如果(!isEmailValid(电子邮件)){
mEmailView.setError(getString(R.string.error\u无效的电子邮件));
focusView=mEmailView;
取消=真;
}
如果(取消){
//出现错误;请不要尝试登录并在第一次登录时集中注意力
//表单字段有错误。
focusView.requestFocus();
}否则{
//TODO:在此处调用create FirebaseUser()
createFirebaseUser();
}
}
私有布尔值isEmailValid(字符串电子邮件){
//您可以在此处添加更多检查逻辑。
返回电子邮件。包含(“@”);
}
私有布尔值isPasswordValid(字符串密码){
//TODO:添加自己的逻辑以检查有效密码(至少6个字符)
字符串confirmPassword=mConfirmPasswordView.getText().toString();
返回confirmPassword.equals(password)和&password.length()>4;
}
//TODO:创建Firebase用户
私有void createFirebaseUser(){
字符串email=mEmailView.getText().toString();
字符串密码=mPasswordView.getText().toString();
mAuth.createUserWithEmailAndPassword(电子邮件,密码).addOnCompleteListener(这是新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
Log.d(“FlashChat”,“createUser onComplete:+task.isSuccessful());
如果(!task.issusccessful()){
Log.d(“FlashChat”,“用户创建失败”);
}
}
});
}
//TODO:将显示名称保存到共享首选项
//TODO:创建警报对话框以在注册失败时显示
}
您的软件包上写着“com.lucianvibez.flashchatnewfirebase;”,您可以从崩溃日志中看到不同之处,日志上写着
未找到类“com.联机.lucianvibez.flashchatnewfirebase.LoginActivity”
请注意,您的软件包中缺少“online”(在线)
我怀疑您的清单文件中有online,因此当您的清单要求在不存在的路径中查找loginActivity时,应用程序会感到困惑。原因:java.lang.ClassNotFoundException:未找到类“com.online.lucianvibez.flashchatnewfirebase.loginActivity”。你把它放在另一个包里了吗?没有。我将添加LoginActivity文件。请看,非常感谢。我记得重构后重新命名了整个包。在那段时间里,我可能意外地发生了一些事情。谢谢