Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to save bitmap to Firebase

I created a simple application which crop the image . Now I want to save this image to the Fire base .

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

            //Intent imageDownload = new 
Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
      Intent imageDownload=new Intent();
      imageDownload.setAction(Intent.ACTION_GET_CONTENT);
      imageDownload.setType("image/*");
      imageDownload.putExtra("crop", "true");
      imageDownload.putExtra("aspectX", 1);
      imageDownload.putExtra("aspectY", 1);
      imageDownload.putExtra("outputX", 200);
      imageDownload.putExtra("outputY", 200);
      imageDownload.putExtra("return-data", true);
      startActivityForResult(imageDownload, GALLERY_REQUEST_CODE);


        }
    });
 }
  @Override
protected void onActivityResult(int requestCode, int resultCode, Intent 
  data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == GALLERY_REQUEST_CODE && resultCode == RESULT_OK && 
   data != null) {
        Bundle extras = data.getExtras();
        image = extras.getParcelable("data");
        photo.setImageBitmap(image);

   }






}

How to save this image to the Firebase . I tried many tutorial but could not succeed . Please verify with simple code .

like image 834
wiki wi Avatar asked Nov 30 '16 10:11

wiki wi


2 Answers

you must first add the dependencies for Firebase Storage to your build.gradle file:

compile 'com.google.firebase:firebase-storage:10.0.1'
compile 'com.google.firebase:firebase-auth:10.0.1'

then create an instance of FirebaseStorage:

FirebaseStorage storage = FirebaseStorage.getInstance();

To upload a file to Firebase Storage, you first create a reference to the full path of the file, including the file name.

// Create a storage reference from our app
StorageReference storageRef = storage.getReferenceFromUrl("gs://<your-bucket-name>");

// Create a reference to "mountains.jpg"
StorageReference mountainsRef = storageRef.child("mountains.jpg");

// Create a reference to 'images/mountains.jpg'
StorageReference mountainImagesRef = storageRef.child("images/mountains.jpg");

// While the file names are the same, the references point to different files
mountainsRef.getName().equals(mountainImagesRef.getName());    // true
mountainsRef.getPath().equals(mountainImagesRef.getPath());    // false

Once you've created an appropriate reference, you then call the putBytes(), putFile(), or putStream() method to upload the file to Firebase Storage.

The putBytes() method is the simplest way to upload a file to Firebase Storage. putBytes() takes a byte[] and returns an UploadTask that you can use to manage and monitor the status of the upload.

// Get the data from an ImageView as bytes
imageView.setDrawingCacheEnabled(true);
imageView.buildDrawingCache();
Bitmap bitmap = imageView.getDrawingCache();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] data = baos.toByteArray();

UploadTask uploadTask = mountainsRef.putBytes(data);
uploadTask.addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle unsuccessful uploads
    }
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
        Uri downloadUrl = taskSnapshot.getDownloadUrl();
    }
});
like image 99
Haythem BEN AICHA Avatar answered Oct 19 '22 06:10

Haythem BEN AICHA


Firebase does not support binary data, so you need to convert the image data to base64 or use Firebase Storage

Method 1 ( Recommended )

 sref = FirebaseStorage.getInstance().getReference(); // please go to above link and setup firebase storage for android

 public void uploadFile(Uri imagUri) {
    if (imagUri != null) {

        final StorageReference imageRef = sref.child("android/media") // folder path in firebase storage
                .child(imagUri.getLastPathSegment());

        photoRef.putFile(imagUri)
                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot snapshot) {
                        // Get the download URL
                        Uri downloadUri = snapshot.getMetadata().getDownloadUrl();
                        // use this download url with imageview for viewing & store this linke to firebase message data

                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                         // show message on failure may be network/disk ?
                    }
                });
    }
}

Method 2

for small images we can still go with this solution, there is firebase field value limitations(1MB field value) check official doc for details

public void getImageData(Bitmap bmp) {  

  ByteArrayOutputStream bao = new ByteArrayOutputStream();
  bmp.compress(Bitmap.CompressFormat.PNG, 100, bao); // bmp is bitmap from user image file
  bmp.recycle();
  byte[] byteArray = bao.toByteArray();
  String imageB64 = Base64.encodeToString(byteArray, Base64.URL_SAFE); 
  //  store & retrieve this string which is URL safe(can be used to store in FBDB) to firebase
  // Use either Realtime Database or Firestore
  }
like image 29
Renjith Thankachan Avatar answered Oct 19 '22 07:10

Renjith Thankachan