【问题标题】:Problems with Firestore Cloud FirestoreFirestore Cloud Firestore 的问题
【发布时间】:2021-03-16 00:38:04
【问题描述】:

我在使用 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;
    }
  }
}

【问题讨论】:

  • 您能否编辑您的帖子以包含相关的 Firestore 代码以及相关的 Firestore 安全规则?
  • @SammyT 完成!希望这就是你问的

标签: android firebase google-cloud-firestore


【解决方案1】:

您的安全规则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_rules https://firebase.google.com/docs/firestore/security/rules-conditions

【讨论】:

  • 谢谢!我已经更改了firestore,现在我正在使用实时数据库并且它工作xd 现在我正试图弄清楚如何在recyclerview 中显示该数据。非常感谢:)
  • 不客气,@MerlinaGutiérrez。如果我的回答解决了您的问题,请记得将其标记为已接受。
猜你喜欢
  • 2021-06-21
  • 2018-09-15
  • 2019-06-26
  • 1970-01-01
  • 2020-10-19
  • 2021-12-31
  • 2018-09-25
  • 1970-01-01
  • 2021-06-13
相关资源
最近更新 更多