android - ClassNotFoundException DynamiteModuleInitializer Android
问题描述
因为我更新了我的 android studio 和 sdk。这些错误立即开始发生并阻止我写给数据库中的孩子,我不知道问题是什么。但似乎当我试图从它正在发生的“EditCarPostActivity”活动中写入数据库时,我可以从其他活动中完美地编写、更新和检索信息。请帮助解决这个问题。我将在下面发布一些活动
错误 1
04-29 18:38:54.685 11007-11034/com.example.ahmad.carrental E/ChimeraFileApk:无法验证 DexClassLoader。java.lang.ClassNotFoundException:在路径上找不到类“com.google.android.gms.chimera.DynamiteModuleInitializer”:DexPathList[[],nativeLibraryDirectories=[/system/lib64, /vendor/lib64, /system/vendor/ lib64,/product/lib64]] 在 dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
错误 2
04-29 18:38:54.686 11007-11034/com.example.ahmad.carrental E/ChimeraModuleLdr:无法加载模块 FileApk 的代码(/data/user_de/0/com.google.android.gms/app_chimera/m/ 0000002d/DynamiteModulesC_GmsCore_prodmnc_alldpi_release.apk) ddp: 无法为 /data/user_de/0/com.google.android.gms/app_chimera/m/0000002d/DynamiteModulesC_GmsCore_prodmnc_alldpi_release.apk 加载代码
错误 3
04-29 18:38:54.686 11007-11034/com.example.ahmad.carrental W/ChimeraDebugLogger:未设置单例记录器实例。04-29 18:38:54.686 11007-11034/com.example.ahmad.carrental E/DynamiteLoaderV2: 创建模块上下文失败。ddp:无法加载 /data/user_de/0/com.google.android.gms/app_chimera/m/0000002d/DynamiteModulesC_GmsCore_prodmnc_alldpi_release.apk 的代码
编辑CarPostActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_car_post);
initialization();
setupFirebaseAuth();
setUpLocationSpinner();
userID = mAuth.getCurrentUser().getUid();
//Assigning Car object with its data from database.
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter emitter) throws Exception {
singleValueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
car = mFirebaseUtilities.getCarByUserID(userID,dataSnapshot);
editCarPostPresenter.populateViews(car);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e(TAG, "CANCELLED.");
}
};
mDatabaseReference.addValueEventListener(singleValueEventListener);
}
}).unsubscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe();
//Save all the changes when done editing to database.
checkButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
editCarPostPresenter.onSaveChanges(car);
}
});
//When user click image button, start image selection from gallery
tvImageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent,GALLERY_INT);
}
});
}
/**
* Will listen for user image selection and will store the selected image in a uri object, then call getUriImage to update it
* When the user finishes editing and clicks the check button along with any change in car information to the database.
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == GALLERY_INT && resultCode == RESULT_OK){
mProgressDialog.setMessage("Uploading .....");
mProgressDialog.show();
Uri uri = data.getData();
storagePathReference = mStorageReference.child("Photos").child(userID).child(uri.getLastPathSegment());
//Update all the information with the image given as Uri
storagePathReference.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(mContext,"Image Upload success!",Toast.LENGTH_SHORT).show();
mProgressDialog.dismiss();
downloadImageUri = taskSnapshot.getDownloadUrl();
Picasso.get().load(downloadImageUri).fit().centerCrop().into(ivCarPicture);
}
});
}
}
public void deleteUnusedImages(Car car){
car = this.car;
String imageID = car.getPicture();
for(int i = 0;i<6;i++){
}
}
//initalizing everything necessary here
public void initialization(){
mContext = getApplicationContext();
editCarPostPresenter = new EditCarPostPresenter(this,this);
//Adapter set up for spinners
mArrayAdapter2 = ArrayAdapter.createFromResource(this,R.array.car_brands,android.R.layout.simple_spinner_item);
mArrayAdapter = ArrayAdapter.createFromResource(this,R.array.car_status_array,android.R.layout.simple_spinner_item);
//Status spinner set up
statusSpinner = findViewById(R.id.createPostCarStatusSpinner_ID);
statusSpinner.setAdapter(mArrayAdapter);
statusSpinner.setOnItemSelectedListener(this);
//Brand spinner set up
brandSpinner = findViewById(R.id.createPostCarBrandSpinner_ID);
brandSpinner.setAdapter(mArrayAdapter2);
brandSpinner.setOnItemSelectedListener(this);
layoutContainer = findViewById(R.id.createPostLinearLayout_ID);
tvDistance = new TextView(this);
tvDistance.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
tvDistance.setText("Distance Travelled");
etDistance = new EditText(this);
etDistance.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
//margin settings editText
layoutParamsEt = (LinearLayout.LayoutParams)etDistance.getLayoutParams();
layoutParamsEt.setMargins(0,10,0,0);
etDistance.setLayoutParams(layoutParamsEt);
//margin settings textView
layoutParamsTv = (LinearLayout.LayoutParams)tvDistance.getLayoutParams();
layoutParamsTv.setMargins(0,10,0,0);
tvDistance.setLayoutParams(layoutParamsTv);
ivCarPicture = findViewById(R.id.createPostCarPic_ID);
tvImageButton = findViewById(R.id.createPostCarLinkPic_ID);
etCarLocation = findViewById(R.id.createPostCarLocation_ID);
etDescription = findViewById(R.id.createPostCarDes_ID);
etPrice = findViewById(R.id.createPostCarPrice_ID);
etModel = findViewById(R.id.createPostCarModel_ID);
checkButton = findViewById(R.id.check_ID);
mFirebaseUtilities = new FirebaseUtilities(this);
mStorageReference = FirebaseStorage.getInstance().getReference();
mProgressDialog = new ProgressDialog(this);
}
private void setUpLocationSpinner() {
ArrayAdapter<String> listOfCities = new ArrayAdapter<>(getBaseContext(),
android.R.layout.simple_list_item_1, getResources().getStringArray(R.array.TR_cities));
//--- to ensure user is restricted to selections from drop-down menu
etCarLocation.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
carLoactionStr = etCarLocation.getAdapter().getItem(position).toString();
}
});
etCarLocation.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
for (int i = 0; i < etCarLocation.getAdapter().getCount(); i++) {
if (etCarLocation.getText().toString().equals(etCarLocation.getAdapter().getItem(i))) {
carLoactionStr = etCarLocation.getAdapter().getItem(i).toString();
} else
carLoactionStr = null;
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
//start autocomplete after 1 letter
etCarLocation.setThreshold(1);
etCarLocation.performCompletion();
etCarLocation.setAdapter(listOfCities);
}
/**
* Listener for car status spinner and brand spinner
* @param parent
* @param view
* @param position
* @param id
*/
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Spinner spinner = (Spinner)parent;
if(spinner.getId() == R.id.createPostCarStatusSpinner_ID){
TextView textView = (TextView) view;
carStatusStr = textView.getText().toString();
addDynamicViews(position);
}
else if(spinner.getId() == R.id.createPostCarBrandSpinner_ID){
TextView textView = (TextView) view;
carBrandStr = textView.getText().toString();
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
/**
* Dynamic views creation done by handling user spinner selection for first hand or second hand car status.
*@param position: position of selected value from spinner
*/
public void addDynamicViews(int position){
/*
* it crashes if you change from first hand to second hand twice at the same time. so dont do it*/
if(position == 1){
layoutContainer.addView(tvDistance);
layoutContainer.addView(etDistance);
}
else if(position == 0){
Log.i(TAG,"entering");
//mFirebaseUtilities.removeNodeDynamically();
layoutContainer.removeView(tvDistance);
layoutContainer.removeView(etDistance);
}
}
@Override
public void setBrand(String brand) {
int spinnerPos = mArrayAdapter.getPosition(brand);
brandSpinner.setSelection(spinnerPos);
}
@Override
public void setPrice(int price) {
etPrice.setText(String.valueOf(price));
}
@Override
public void setLocation(String location) {
etCarLocation.setText(location);
}
@Override
public void setDescription(String description) {
etDescription.setText(description);
}
@Override
public void setModel(String model) {
etModel.setText(model);
}
@Override
public void setDistance(String distance) {
etDistance.setText(distance);
}
@Override
public void setStatus(String status) {
int spinnerPos = mArrayAdapter.getPosition(status);
statusSpinner.setSelection(spinnerPos);
}
@Override
public void setPicture(String picture) {
Picasso.get().load(picture).fit().centerCrop().into(ivCarPicture);
}
@Override
public String getBrand() {
return carBrandStr;
}
@Override
public String getDescription() {
return etDescription.getText().toString();
}
@Override
public String getLocation() {
return carLoactionStr;
}
@Override
public String getModel() {
return etModel.getText().toString();
}
@Override
public String getStatus() {
return carStatusStr;
}
@Override
public String getPicture() {
return downloadImageUri.toString();
}
@Override
public int getPrice() {
String priceViewTemp = etPrice.getText().toString();
if (priceViewTemp.equals("")) {
return 0;
} else {
return Integer.valueOf(etPrice.getText().toString());
}
}
@Override
public String getDistance() {
String distanceViewTemp = etDistance.getText().toString();
if (distanceViewTemp.equals("")) {
return "0";
} else {
return etDistance.getText().toString();
}
}
/*************************************** Firebase *******************************************/
private void setupFirebaseAuth() {
mAuth = FirebaseAuth.getInstance();
mFirebaseDatabase = FirebaseDatabase.getInstance();
mDatabaseReference = mFirebaseDatabase.getReference();
mAuthStateListener = 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: user signed in : " + user.getUid());
} else {
//User is signed out
Log.d(TAG, "onAuthStateChanged: user signed out");
}
}
};
mDatabaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public void onPause() {
super.onPause();
if (singleValueEventListener != null) {
mDatabaseReference.removeEventListener(singleValueEventListener);
}
}
@Override
public void onResume(){
super.onResume();
mDatabaseReference.addListenerForSingleValueEvent(singleValueEventListener);
}
}
如果您需要更多信息,您可以询问。是的,我的 firebase 身份验证以及存储和实时数据库已启用
解决方案
我在我的华为设备(带有 android 7.0 的 P9 Lite)上遇到了同样的问题,要解决这个问题,只需删除当前安装的 Google Play 服务版本,将其恢复为我们设备随附的默认版本(这可以通过设置应用程序)。然后重新启动您的设备,并将 Google Play 服务应用程序更新到最新版本。然后运行您的应用程序,它应该可以工作。
推荐阅读
- angular - 切换标签时添加动画
- ffmpeg - ffmpeg 命令生成黑色图像作为输出
- nuxt.js - 如何配置 nuxt 或网页以使路由在末尾不带“/”
- node.js - Express 中间件配置响应
- angular - 使用 aot compile 时,angular 9 无法绑定
- flyway - Flyway 企业版是否允许 SqlServer 2012 数据库迁移自动化流程
- node.js - TypeError:this.findOne 不是函数
- html - Bootstrap4 布局问题 - 用内容填充浏览器页面高度
- c# - 如何将 Blazor 服务器端与 Blazor WebAssembly 结合使用?
- reactjs - 笑话和酶:如何使用 useContext() 测试组件