【发布时间】:2018-04-29 15:51:51
【问题描述】:
自从我更新了我的 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 的代码
EditCarPostActivity
@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 华为 mate 10 lite
-
在我看来,Play 服务有问题。尝试使用具有 Play 商店的模拟器。
-
但是我该如何解决这个问题。模拟器总是在我的电脑上崩溃,我尝试了另一个无法正常工作的设备。我需要找出问题并解决它
-
您最好联系 Firebase 支持。 firebase.google.com/support/contact/troubleshooting
标签: android firebase firebase-realtime-database firebase-authentication