AHMED ABBAS
AHMED ABBAS

Reputation: 43

Android Send Camera Intent Image to Firebase

I have one ImageButton. Whenever We click on ImageButton Camera Intent is open and we take a snap. Everything is working till here is fine. So, How can I upload this camera Intent image to Firebase with authentication? I am not able to find any tutorial video which thought us this but I try to encode the image in a function name called submit. From here I don't know what to do

package com.example.android.besafe;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.Image;
import android.net.Uri;
import android.os.storage.StorageManager;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.OnProgressListener;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import static com.example.android.besafe.R.id.imageview;

public class CameraActivity extends AppCompatActivity {
    private ImageButton mProfileImage;
    Bitmap photo;
    private static final int CAMERA_REQ = 1;
    StorageReference mstorageRef;
    String userId;
    private FirebaseAuth mAuth;
    FirebaseUser firebaseUser;
    FirebaseDatabase firebaseDatabase;
    DatabaseReference ref;

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

        mProfileImage = (ImageButton) findViewById(R.id.btnselect);
        firebaseDatabase = FirebaseDatabase.getInstance();
        ref = firebaseDatabase.getReference("ProfileInfo");
        mAuth = FirebaseAuth.getInstance();

        firebaseUser = mAuth.getCurrentUser();
        userId = firebaseUser.getUid();

        mProfileImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(cameraIntent, CAMERA_REQ);

            }
        });
    }

    public void submit(View v){

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        photo.compress(Bitmap.CompressFormat.JPEG, 100, stream);

        byte[] b = stream.toByteArray();

        StorageReference storageReference =mstorageRef.child("documentImages").child(userId).child("noplateImg");
        //StorageReference filePath = FirebaseStorage.getInstance().getReference().child("profile_images").child(userID);
        storageReference.putBytes(b).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                Uri downloadUrl = taskSnapshot.getDownloadUrl();

            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(CameraActivity.this,"failed",Toast.LENGTH_LONG).show();


            }
        });

    }


    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAMERA_REQ && resultCode ==RESULT_OK) {

            photo = (Bitmap) data.getExtras().get("data");

        }
    }

}

Upvotes: 3

Views: 2611

Answers (2)

Yasin Ege
Yasin Ege

Reputation: 723

task.getDowloadUrl() not defined. You can use this i check , working perfectly.

 private void firebaseUploadBitmap(Bitmap bitmap) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] data = stream.toByteArray();
    StorageReference imageStorage = storage.getReference();
    StorageReference imageRef = imageStorage.child("images/" + "imageName");

    Task<Uri> urlTask = imageRef.putBytes(data).continueWithTask(task -> {
        if (!task.isSuccessful()) {
            throw task.getException();
        }

        // Continue with the task to get the download URL
        return imageRef.getDownloadUrl();
    }).addOnCompleteListener(task -> {
        if (task.isSuccessful()) {
            Uri downloadUri = task.getResult();
            String uri = downloadUri.toString();
            sendMessageWithFile(uri);
        } else {
            // Handle failures
            // ...
        }
        progressBar.setVisibility(View.GONE);
    });
    
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_IMAGE && resultCode == Activity.RESULT_OK) {
        //      Bitmap imageBitmap = data.getData() ;
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        if (photo != null)
            firebaseUploadBitmap(photo);

    } else if (requestCode == SELECT_IMAGE && resultCode == Activity.RESULT_OK) {

        Uri uri = data.getData();
        if (uri != null)
            firebaseUploadImage(uri);
    }

}

Upvotes: 0

Amir Dora.
Amir Dora.

Reputation: 2707

I found two errors in your code, you're not calling submit() method, so it never executes.

The second you did not make a instance of mstorageRef.

Check code below, i tested and uploaded an image. i am doing it without user authentication, for the sake of simplicity.

enter image description here

public class CameraActivity extends AppCompatActivity {
    private ImageButton mProfileImage;
    Bitmap photo;
    private static final int CAMERA_REQ = 1;
    StorageReference mstorageRef;
    String userId;
    private FirebaseAuth mAuth;
    FirebaseUser firebaseUser;
    FirebaseDatabase firebaseDatabase;
    DatabaseReference ref;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mProfileImage = (ImageButton) findViewById(R.id.image_holder);
        firebaseDatabase = FirebaseDatabase.getInstance();
        ref = firebaseDatabase.getReference("ProfileInfo");
        mAuth = FirebaseAuth.getInstance();

        firebaseUser = mAuth.getCurrentUser();
//        userId = firebaseUser.getUid();

        mProfileImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(cameraIntent, CAMERA_REQ);

            }
        });
    }

    public void submit(){

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        photo.compress(Bitmap.CompressFormat.JPEG, 100, stream);

        byte[] b = stream.toByteArray();
        StorageReference storageReference =FirebaseStorage.getInstance().getReference().child("documentImages").child("noplateImg");
        //StorageReference filePath = FirebaseStorage.getInstance().getReference().child("profile_images").child(userID);
        storageReference.putBytes(b).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                Uri downloadUrl = taskSnapshot.getDownloadUrl();
                Toast.makeText(CameraActivity.this, "uploaded", Toast.LENGTH_SHORT).show();

            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(CameraActivity.this,"failed",Toast.LENGTH_LONG).show();


            }
        });

    }


    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAMERA_REQ && resultCode ==RESULT_OK) {

            photo = (Bitmap) data.getExtras().get("data");
            submit();
        }
    }
}

something to keep in mind

  • check firebase storage read write permissions are set to allow if not using user authentication.

  • camera is dangerous permission, you need to ask permission from user to use it. add permission in manifest and code for using camera

  • make sure your internet/wifi is on

Upvotes: 5

Related Questions