0

How to upload image in Firestore Storage from Android app and then save Download Url in Firestore database in Android? This is my code on which I was working. It looks like saving Image into Firestore is different from saving into Firebase. Kindly advise were I am doing wrong? Thanks in advance for your suggestion and help.

package com.support.android.designlibdemo.View.UI;
import android.content.ContentResolver;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Window;
import android.webkit.MimeTypeMap;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.OnProgressListener;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.StorageTask;
import com.google.firebase.storage.UploadTask;
import com.support.android.designlibdemo.R;
import com.support.android.designlibdemo.include.ImageClass;

public class UploadImage extends AppCompatActivity {

    private static final int PICK_IMAGE_REQUEST = 1;

    private Button mButtonChooseImage;
    private Button mButtonUpload;
        private TextView mTextViewShowUploads;
    private EditText mEditTextFileName;
    private ImageView mImageView;
    private ProgressBar mProgressBar;

    private Uri mImageUri;

    private StorageReference mStorageRef;
    private DatabaseReference mDatabaseRef;

    private StorageTask mUploadTask;
    FirebaseStorage storage = FirebaseStorage.getInstance();


    @Override
    protected void onCreate(Bundle savedInstanceState) {

    // Request window feature action bar
    requestWindowFeature(Window.FEATURE_ACTION_BAR);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.user_upd_orgmember);
    final Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);



    mButtonChooseImage = findViewById(R.id.button_choose_image);
    mButtonUpload = findViewById(R.id.button_upload);
    mTextViewShowUploads = findViewById(R.id.text_view_show_uploads);
    mEditTextFileName = findViewById(R.id.edit_text_file_name);
    mImageView = findViewById(R.id.image_view);
    mProgressBar = findViewById(R.id.progress_bar);

    mStorageRef = FirebaseStorage.getInstance().getReference("uploads");
    mDatabaseRef = FirebaseDatabase.getInstance().getReference("uploads");

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

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

        }
    });

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

        }
    });
  }
    private void openFileChooser() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(intent, PICK_IMAGE_REQUEST);
  }

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

    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
            && data != null && data.getData() != null) {
        mImageUri = data.getData();

        RequestOptions options = new RequestOptions();


     Glide.with(this).load(mImageUri)
    .apply(options.fitCenter())
    .into(mImageView);

    }
}

    private String getFileExtension(Uri uri) {
        ContentResolver cR = getContentResolver();
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        return mime.getExtensionFromMimeType(cR.getType(uri));
}

    private void uploadFile() {
        if (mImageUri != null) {
        StorageReference fileReference = 
   mStorageRef.child(System.currentTimeMillis()
                + "." + getFileExtension(mImageUri));

        mUploadTask = fileReference.putFile(mImageUri)
                .addOnSuccessListener(new 
      OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot 
     taskSnapshot) {
                        Handler handler = new Handler();
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                mProgressBar.setProgress(0);
                            }
                        }, 500);

                        Toast.makeText(UploadImage.this, "Upload 
    successful", Toast.LENGTH_LONG).show();
                        ImageClass upload = new 
    ImageClass(mEditTextFileName.getText().toString().trim(),

  *taskSnapshot.getDownloadUrl().toString())*;//Got stuck in this statement.
                        //Save in Firestore DB.
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(UploadImage.this, e.getMessage(), 
      Toast.LENGTH_SHORT).show();
                    }
                })
                .addOnProgressListener(new 
   OnProgressListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onProgress(UploadTask.TaskSnapshot 
     taskSnapshot) {
                        double progress = (100.0 * 
    taskSnapshot.getBytesTransferred() / 
   taskSnapshot.getTotalByteCount());
                        mProgressBar.setProgress((int) progress);
                    }
                });
    } else {
        Toast.makeText(this, "No file selected", 
   Toast.LENGTH_SHORT).show();
    }
  }

    }
Sukesh Saxena
  • 201
  • 2
  • 18

1 Answers1

0

I would do something like this:

private FirebaseDatabase firebaseDatabase;
private DatabaseReference databaseReference;

private FirebaseStorage firebaseStorage;
private StorageReference storageReference;

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

    firebaseDatabase = FirebaseDatabase.getInstance();
    databaseReference = firebaseDatabase.getReference();

    firebaseStorage = FirebaseStorage.getInstance();
    storageReference = firebaseStorage.getReference("my_upload_directory_name");

//In the putFile method, you get a TaskSnapshot which contains the details of your uploaded file
storageReference.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

               //Upload URL we need to save to the database
                String uploadedImageUrl = taskSnapshot.getDownloadUrl().toString();

               //Now save the URL to the database
                 saveUploadUrlToFirebaseDatabase(uploadedImageUrl );
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
              //Failed
            }
}

private void saveUploadUrlToFirebaseDtabase(String uploadedImageUrl ){
  databaseReference.child("your_root_name").setValue(uploadedImageUrl ).
  addSuccessListener(...).addFailureListener(...);
}
Oush
  • 3,090
  • 23
  • 22