如何获取 firebase 存储的下载 url 并更新 firestore 文档?

塔哈

我一直在努力获取从我的应用程序上传到 firebase 存储的图像的下载 url。我想将此 url 发送到 firestore 数据库(不是实时数据库)。我将 itemImageUri 设置为uri.toString()但在onCreate()方法 itemImageUrl 中为 null 并在 firestore 中显示为 null。我不能CollectionRefernece addItemRefonSuccess方法中使用因为它会为所有字符串变量提供错误:从内部类访问的变量需要声明为最终的。

public class AddItemActivity extends AppCompatActivity {

    public class AddItemActivity extends AppCompatActivity {
    public static final int PICK_IMAGE_REQUEST = 1;
    public static final String TAG = "Error!";
    public static final String UPLOAD_TAG = "Image uploaded";
    private Uri imageUri = null;
    private TextInputEditText textFieldTitle;
    private TextInputEditText textFieldDesc;
    private AutoCompleteTextView dropdownItemType;
    private TextInputEditText textFieldAddress;
    private TextInputEditText textFieldAvailability;
    private MaterialButton buttonSubmitItem;
    private MaterialButton buttonAddImage;
    private ImageView imageViewItem;
    private String itemImageUrl;
    private Bitmap bitmap;
    private Uri itemImageUri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_item);

        imageViewItem = findViewById(R.id.imageView_camera);
        textFieldTitle = findViewById(R.id.textField_title);
        textFieldDesc = findViewById(R.id.textField_description);
        dropdownItemType = findViewById(R.id.dropdown_itemType);
        //Select type dropdown
        String[] itemTypes = new String[] {
                "Food",
                "Clothing",
                "Footwear"
        };
        ArrayAdapter<String> itemsDropdownAdpater = new ArrayAdapter<>(AddItemActivity.this, R.layout.dropdown_item_type, itemTypes);
        dropdownItemType.setAdapter(itemsDropdownAdpater);

        textFieldAddress = findViewById(R.id.textField_address);
        textFieldAvailability = findViewById(R.id.textField_availability);
        buttonAddImage = findViewById(R.id.button_addImage);
        buttonSubmitItem = findViewById(R.id.button_submitItem);

        buttonAddImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (ContextCompat.checkSelfPermission(AddItemActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                        Toast.makeText(AddItemActivity.this, "Permission Denied", Toast.LENGTH_LONG).show();
                        ActivityCompat.requestPermissions(AddItemActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
                    } else {
                        choseImage();
                    }
                } else {
                    choseImage();
                }
            }
        });

        buttonSubmitItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                submitItem();
            }
        });
    }

    private void choseImage() {
        CropImage.activity()
                .setGuidelines(CropImageView.Guidelines.ON)
                .setAspectRatio(1, 1)
                .start(AddItemActivity.this);
    }

    private void submitItem() {
        String title = textFieldTitle.getText().toString();
        String desc = textFieldDesc.getText().toString();
        String type = dropdownItemType.getText().toString();
        String address = textFieldAddress.getText().toString();
        String availability = textFieldAvailability.getText().toString();
        
        if (title.trim().isEmpty() ||
                desc.trim().isEmpty() ||
                type.trim().isEmpty() ||
                availability.trim().isEmpty()) {
            Toast.makeText(this, "Fields cant be empty", Toast.LENGTH_SHORT).show();
            return;
        }
       
        handleUpload(bitmap);
        CollectionReference addItemRef = FirebaseFirestore.getInstance()
                .collection("ItemList");
        addItemRef.add(new ItemListModel(title, desc, type, address, availability, itemImageUrl));
        Toast.makeText(this, "Item added", Toast.LENGTH_SHORT).show();
        finish();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
            CropImage.ActivityResult result = CropImage.getActivityResult(data);
            if (resultCode == RESULT_OK) {
                imageUri = result.getUri();
                imageViewItem.setImageURI(imageUri);
                imageViewItem.invalidate();
                BitmapDrawable drawable = (BitmapDrawable) imageViewItem.getDrawable();
                bitmap = drawable.getBitmap();
            } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
                Exception error = result.getError();
            }
        }
    }

    private void handleUpload(Bitmap bitmap) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        final StorageReference reference = FirebaseStorage.getInstance().getReference()
                .child("itemImages")
                .child(System.currentTimeMillis() + ".jpeg");

        reference.putBytes(baos.toByteArray())
                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        getItemImageUrl(reference);
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.e(TAG, "onFailure: ", e.getCause());
                    }
                });
    }

    private void getItemImageUrl(StorageReference reference) {
        reference.getDownloadUrl()
                .addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        itemImageUrl = uri.toString();
                    }
                });

    }
}
弗兰克·范·普费伦

确定下载 URL 需要调用服务器,这意味着它是异步发生的。出于这个原因,任何需要下载 URL 的代码都需要在onSuccessof内部getDownloadURL()或从那里调用。

所以:

private void getItemImageUrl(StorageReference reference) {
    reference.getDownloadUrl()
            .addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri uri) {
                    itemImageUrl = uri.toString();

                    ... here you can write itemImageUrl to the database
                }
            });

}

另见:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从 firebase 存储获取多个下载 URL 并将它们保存到 firebase firestore

Firebase / Firestore文档未更新

将Firebase存储下载URL推送到Firebase Cloud Firestore

如何从Firebase存储到Firestore获取图像URL

如何在Firebase Firestore中更新文档ID?

如何使用Firebase云功能更新Firestore文档的值

如何使用集合更新 firebase firestore 文档中的字段

如何从文档Firebase Firestore实时更新中获取修改后的字段或数据?

获取Firebase存储文件的下载URL

如何从Firebase存储PHP获取图像的下载URL?

如何更新Firebase文档

Firestore 获取文档下载计数?

如何获取Firebase存储下载URL的值并将其存储在Firebase存储中....,

如何使用 RxJS 从 Firestore 集合中检索存储下载 URL?

如何从firebase.firestore.DocumentSnapshot获取文档数据?

在Firestore中批量写入后,如何获取更新的文档参考?

如何获取Firebase存储URL

Firebase Firestore:获取生成的文档ID(Python)

firebase firestore从文档获取对象/数组-js

通过传递Firebase存储参考获取图像下载URL

从Angular中的Firebase存储获取下载URL

Firebase 存储,无法成功获取下载 url。(安卓)

从Firebase存储获取下载URL时出现问题

无法从 Firebase 存储中获取下载 url

Firebase Firestore如何考虑文档写入?

AngularFire2-Firebase存储getDownloadURL()-如何返回Firestore的URL

如何更新firestore中文档中的字段

Android Firebase Firestore:从Firestore文档的深层获取数据

Firebase存储下载URL格式