问题描述
我几乎和这个问题有同样的问题,但没有答案。 Can't import "import com.google.firebase.firestore.MetadataChanges"
我正在 https://openclassrooms.com/en/courses/5086986-create-a-scalable-and-powerful-backend-for-android-using-firebase-in-java/5769306-implement-a-chat-room 处关注代码
错误日志
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/firebase/firestore/MetadataChanges;
at com.firebase.ui.firestore.FirestoreRecyclerOptions$Builder.setQuery(FirestoreRecyclerOptions.java:86)
at com.sp.firestorechat.mentor_chat.MentorChatActivity.generateOptionsForAdapter(MentorChatActivity.java:126) //blue highlighted
at com.sp.firestorechat.mentor_chat.MentorChatActivity.configureRecyclerView(MentorChatActivity.java:112)//blue highlighted
at com.sp.firestorechat.mentor_chat.MentorChatActivity.onCreate(MentorChatActivity.java:57)//blue highlighted
at android.app.Activity.performCreate(Activity.java:6679)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2618)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.classNotFoundException: Didn't find class "com.google.firebase.firestore.MetadataChanges" on path: DexPathList[[zip file "/data/app/com.sp.firestorechat-2/base.apk"],nativeLibraryDirectories=[/data/app/com.sp.firestorechat-2/lib/x86_64,/system/lib64,/vendor/lib64]]
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 com.firebase.ui.firestore.FirestoreRecyclerOptions$Builder.setQuery(FirestoreRecyclerOptions.java:86)
at com.sp.firestorechat.mentor_chat.MentorChatActivity.generateOptionsForAdapter(MentorChatActivity.java:126)
at com.sp.firestorechat.mentor_chat.MentorChatActivity.configureRecyclerView(MentorChatActivity.java:112)
at com.sp.firestorechat.mentor_chat.MentorChatActivity.onCreate(MentorChatActivity.java:57)
at android.app.Activity.performCreate(Activity.java:6679)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2618)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
build.gradle 文件
plugins {
id 'com.android.application'
id 'com.google.gms.google-services'
}
android {
compileSdkVersion 30
buildToolsversion "30.0.2"
defaultConfig {
applicationId "com.sp.firestorechat"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation filetree(dir: 'libs',include: ['*.jar'])
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0'
implementation 'org.jetbrains:annotations:15.0'
implementation 'com.google.firebase:firebase-auth:20.0.2'
implementation 'com.firebaseui:firebase-ui-auth:3.1.3'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.google.android.material:material:1.3.0'
implementation "com.google.firebase:firebase-core:18.0.2"
implementation 'androidx.annotation:annotation:1.1.0'
implementation 'com.google.android.gms:play-services-auth:19.0.0'
implementation 'com.facebook.android:facebook-android-sdk:5.15.3'
implementation 'com.google.firebase:firebase-firestore:22.0.2'
testImplementation 'junit:junit:4.13.1'
implementation 'com.google.firebase:firebase-database:19.6.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
implementation "androidx.legacy:legacy-support-v4:"
implementation "androidx.recyclerview:recyclerview:"
implementation 'com.google.firebase:firebase-messaging:21.0.1'
//GLIDE
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
//BUTTERKNIFE
implementation 'com.jakewharton:butterknife:10.0.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0'
// firebaseui for Cloud Firestore
implementation 'com.firebaseui:firebase-ui-firestore:7.1.1'
}
apply plugin: 'com.google.gms.google-services'
聊天活动
package com.sp.firestorechat.mentor_chat;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.linearlayoutmanager;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.material.textfield.TextInputEditText;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.Query;
import com.sp.firestorechat.Message;
import com.sp.firestorechat.MessageHelper;
import com.sp.firestorechat.R;
import com.sp.firestorechat.User;
import com.sp.firestorechat.UserHelper;
import com.sp.firestorechat.base.BaseActivity;
import butterknife.BindView;
import butterknife.OnClick;
public class MentorChatActivity extends BaseActivity implements MentorChatAdapter.Listener {
// FOR DESIGN
// 1 - Getting all views needed
@BindView(R.id.activity_mentor_chat_recycler_view) RecyclerView recyclerView;
@BindView(R.id.activity_mentor_chat_text_view_recycler_view_empty)
TextView textViewRecyclerViewEmpty;
@BindView(R.id.activity_mentor_chat_message_edit_text)
TextInputEditText editTextMessage;
@BindView(R.id.activity_mentor_chat_image_chosen_preview)
ImageView imageViewPreview;
// FOR DATA
// 2 - Declaring Adapter and data
private MentorChatAdapter mentorChatAdapter;
@Nullable
private User modelCurrentUser;
private String currentChatName;
// STATIC DATA FOR CHAT (3)
private static final String CHAT_NAME_ANDROID = "android";
private static final String CHAT_NAME_BUG = "bug";
private static final String CHAT_NAME_FIREBASE = "firebase";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.configureRecyclerView(CHAT_NAME_ANDROID);
this.configuretoolbar();
this.getCurrentUserFromFirestore();
}
@Override
public int getFragmentLayout() { return R.layout.activity_mentor_chat; }
// --------------------
// ACTIONS
// --------------------
@OnClick(R.id.activity_mentor_chat_send_button)
public void onClickSendMessage() { }
@OnClick({ R.id.activity_mentor_chat_android_chat_button,R.id.activity_mentor_chat_firebase_chat_button,R.id.activity_mentor_chat_bug_chat_button})
public void onClickChatButtons(ImageButton imageButton) {
// 8 - Re-Configure the RecyclerView depending chosen chat
switch (Integer.valueOf(imageButton.getTag().toString())){
case 10:
this.configureRecyclerView(CHAT_NAME_ANDROID);
break;
case 20:
this.configureRecyclerView(CHAT_NAME_FIREBASE);
break;
case 30:
this.configureRecyclerView(CHAT_NAME_BUG);
break;
}
}
@OnClick(R.id.activity_mentor_chat_add_file_button)
public void onClickAddFile() { }
// --------------------
// REST REQUESTS
// --------------------
// 4 - Get Current User from Firestore
private void getCurrentUserFromFirestore(){
UserHelper.getUser(getCurrentUser().getUid()).addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
modelCurrentUser = documentSnapshot.toObject(User.class);
}
});
}
// --------------------
// UI
// --------------------
// 5 - Configure RecyclerView with a Query
private void configureRecyclerView(String chatName){
//Track current chat name
this.currentChatName = chatName;
//Configure Adapter & RecyclerView
this.mentorChatAdapter = new MentorChatAdapter(generateOptionsForAdapter(MessageHelper.getAllMessageForChat(this.currentChatName)),Glide.with(this),this,this.getCurrentUser().getUid());
mentorChatAdapter.registeradapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart,int itemCount) {
recyclerView.smoothScrollToPosition(mentorChatAdapter.getItemCount()); // Scroll to bottom on new messages
}
});
recyclerView.setLayoutManager(new linearlayoutmanager(this));
recyclerView.setAdapter(this.mentorChatAdapter);
}
// 6 - Create options for RecyclerView from a Query
private FirestoreRecyclerOptions<Message> generateOptionsForAdapter(Query query){
return new FirestoreRecyclerOptions.Builder<Message>()
.setQuery(query,Message.class)
.setLifecycleOwner(this)
.build();
}
// --------------------
// CALLBACK
// --------------------
@Override
public void onDataChanged() {
// 7 - Show TextView in case RecyclerView is empty
textViewRecyclerViewEmpty.setVisibility(this.mentorChatAdapter.getItemCount() == 0 ? View.VISIBLE : View.GONE);
}
}
.setQuery(query,Message.class)
this.mentorChatAdapter = new MentorChatAdapter(generateOptionsForAdapter(MessageHelper.getAllMessageForChat(this.currentChatName)),this.getCurrentUser().getUid());
this.configureRecyclerView(CHAT_NAME_ANDROID);
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)