Problems with Firestore Cloud Firestore



我在使用Cloud Firestore时遇到了一些问题。我有一个活动,用户可以上传一个带有文本、图像视图和进度条的配置文件,然后还有一个显示配置文件的活动。当我按下按钮时,数据永远不会上传,进度条只是继续运行,但我注意到图像已加载到Firebase中的存储中,但";数据库";的文本没有显示。我已经在调试模式下运行了该应用程序,它显示如下:

" I/System.out: [OkHttp] sendRequest<<
D/ViewRootImpl[Toast]: hardware acceleration = true , fakeHwAccelerated = false, sRendererDisabled = false, forceHwAccelerated = false, sSystemRendererDisabled = false
D/Surface: Surface::allocateBuffers(this=0x7e418b2000)
D/Surface: Surface::connect(this=0x7e418b2000,api=1)
W/Firestore: (22.1.1) [WriteStream]: (412dab7) Stream closed with status: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}.
W/Firestore: (22.1.1) [Firestore]: Write failed at receta/profile: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
D/Surface: Surface::disconnect(this=0x7e418b2000,api=1)
D/View: [Warning] assignParent to null: this = android.widget.LinearLayout{ea950d4 V.E...... ......ID 0,0-257,86}
D/ViewRootImpl[Toast]: hardware acceleration = true , fakeHwAccelerated = false, sRendererDisabled = false, forceHwAccelerated = false, sSystemRendererDisabled = false
D/Surface: Surface::allocateBuffers(this=0x7e418b2000)
D/Surface: Surface::connect(this=0x7e418b2000,api=1)
D/Surface: Surface::disconnect(this=0x7e418b2000,api=1)
D/View: [Warning] assignParent to null: this = android.widget.LinearLayout{399fdc3 V.E...... ......ID 0,0-314,86} "

这是我的代码:

ImageView imageView;
EditText et_titrec, et_ingre, et_rece;
Button button;
ProgressBar progressBar;
private Uri imageUri;
private static final int PICK_IMAGE = 1;
UploadTask uploadTask;
FirebaseStorage firebaseStorage;
StorageReference storageReference;
FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference documentReference;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_agregar_receta);
imageView = findViewById(R.id.imageview_agrerec);
et_titrec = findViewById(R.id.et_titrec);
et_ingre = findViewById(R.id.et_ingre);
et_rece = findViewById(R.id.et_receta);
button = findViewById(R.id.btn_agregarreceta);
progressBar = findViewById(R.id.progressbar_ar);
documentReference = db.collection("receta").document("profile");
storageReference = firebaseStorage.getInstance().getReference("profile image");
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UploadData();
}
});
}
public void elegirImagen(View view) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, PICK_IMAGE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == PICK_IMAGE || resultCode == RESULT_OK || data !=null || data.getData() !=null){
imageUri = data.getData();
Picasso.get().load(imageUri).into(imageView);
}
}
private String getFileExt (Uri uri){
ContentResolver contentResolver = getContentResolver();
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
return mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri));
}
private void UploadData(){
String titulo = et_titrec.getText().toString();
String ingredientes = et_ingre.getText().toString();
String receta = et_rece.getText().toString();
if(!TextUtils.isEmpty(titulo) || !TextUtils.isEmpty(ingredientes) || !TextUtils.isEmpty(receta) || imageUri != null){
progressBar.setVisibility(View.VISIBLE);
final StorageReference reference = storageReference.child(System.currentTimeMillis() + "." + getFileExt(imageUri));
uploadTask = reference.putFile(imageUri);
Task<Uri> uriTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
@Override
public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
if(!task.isSuccessful()){
throw task.getException();
}
return reference.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()){
Uri downloadUri = task.getResult();
Map<String, Object> profile = new HashMap<>();
profile.put("titulo", titulo);
profile.put("ingredientes", ingredientes);
profile.put("receta", receta);
profile.put("url", downloadUri.toString());
Toast.makeText(agregarReceta.this,"Receta cargada", Toast.LENGTH_SHORT).show();
documentReference.set(profile).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
progressBar.setVisibility(View.INVISIBLE);
Toast.makeText(agregarReceta.this,"Receta cargada", Toast.LENGTH_SHORT).show();
Intent i = new Intent(agregarReceta.this, mostrarReceta.class);
startActivity(i);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(agregarReceta.this, "Error al cargar receta", Toast.LENGTH_SHORT).show();
}
});
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
} else {
Toast.makeText(this, "Debes llenar todos los campos", Toast.LENGTH_SHORT).show();
}
}
}

以下是Firestore的规则

rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}

您的安全规则allow read, write: if false;完全关闭了对数据库的访问。

在开发过程中解决此问题的最简单方法是将安全性更改为开放访问。这些规则应该可以在开发中使用。但是,您很可能不想在生产应用程序中使用开放访问规则:

allow read, write: if true;

一个更好的解决方案是在您的应用程序中包含身份验证,并将对数据库的访问限制为仅限具有以下规则的经过身份验证的用户:

allow read, write: if request.auth != null;

您可以在以下链接中找到有关安全规则的更多信息:https://firebase.google.com/docs/firestore/security/get-started#writing_ruleshttps://firebase.google.com/docs/firestore/security/rules-conditions

最新更新