如何将 downloadUrl 添加到 firebaseDB 对象?

How to add downloadUrl to the firebaseDB object?

我对 Firebase 存储和实时数据库有疑问。我的 firebase 对象由 4 个字符串字段组成,其中三个来自 EditText 小部件,第四个必须是我放入 Firebase 存储的图像的下载URL,但我不明白如何把它放在那里。

我当前将数据推送到 FirebaseDB 的代码如下:

sendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            try {
                menuItem menuItem = new menuItem(name.getText().toString(), description.getText().toString(), Integer.parseInt(price.getText().toString()), mChosenStorageRef.getDownloadUrl().toString());
                mChosenDBRef.push().setValue(menuItem);
            } catch (NumberFormatException exception) {
                Toast toast = Toast.makeText(MainActivity.this, R.string.price_error, Toast.LENGTH_LONG);
                toast.show();
            }

            name.setText("");
            description.setText("");
            price.setText("");

mChosenStorageRef.getDownloadUrl().toString() 方法给了我类似 "com.google.android.gms.tasks.zzh@96b2841" 但不是正确的 URL.

我可以从下面的代码中得到正确的donwloadURL,bot我不明白如何把它放到上面的push方法中。

uploadImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(intent, RC_PHOTO_PICKER);




        }
    });


}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == RC_PHOTO_PICKER)
    {

        Uri imageUri = data.getData();
       mChosenStorageRef = mChosenStorageRef.child(imageUri.getLastPathSegment());
        mChosenStorageRef.putFile(imageUri).addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                Uri downloadUri = taskSnapshot.getDownloadUrl();


            }
        });
    }
}

你刚刚从 mChosenStorageRef.getDownloadUrl()

得到 Task<Uri>

我有 2 个想法可以为您获取 downloadUrl。

  1. taskSnapshot.getDownloadUrl() 作为字符串保存到 putFile 的回调中的实例变量,然后您可以在发送之前检查该变量的值如果需要,可以添加到 RTDB。

    mDownloadUrl = taskSnapshot.getDownloadUrl().toString();
    
  2. 从Storage中获取downloadUrl,这种方式需要先回调响应,然后获取uri再转成字符串发送给RTDB。

    mChosenStorageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener < Uri > () {
        @Override public void onSuccess(Uri uri) {
            mDownloadUrl = uri.toString();
            // Send datas to RTDB
        }
    });
    

这个问题比我想象的要简单。我将 URI 存储到 onCreate 之外的 URI 变量中,稍后在上传方法中使用它。

需要多多学习java。感谢大家的关注和帮助。

 private Uri downloadURL;

sendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            try {
                menuItem menuItem = new menuItem(name.getText().toString(), description.getText().toString(), Integer.parseInt(price.getText().toString()), downloadURL.toString());
                mChosenDBRef.push().setValue(menuItem);
            } catch (NumberFormatException exception) {
                Toast toast = Toast.makeText(MainActivity.this, R.string.price_error, Toast.LENGTH_LONG);
                toast.show();
            }

 public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RC_PHOTO_PICKER) {

         Uri imageUri = data.getData();


        mChosenStorageRef = mChosenStorageRef.child(imageUri.getLastPathSegment());
        mChosenStorageRef.putFile(imageUri).addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() {


            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

               downloadURL = taskSnapshot.getDownloadUrl();
                Toast toast = Toast.makeText(MainActivity.this, "Successful", Toast.LENGTH_LONG);
                toast.show();




            }
        });