user17093321
user17093321

Reputation:

How to get image URL from Firebase Storage in Android using Java?

I made an application that makes a list of people that contains (name, age, description, and photo), but the problem that I searched too much but I don't find the solution. This is codes for AddPerson:

public class AddPersonextends AppCompatActivity {
    private TextInputEditText mFirstName, mLastName, mAge, mDescription;
    private String firstNameString, lastNameString, ageString, descriptionString;
    private Uri imageUri = null;
    CardView mInsertImage;
    ImageView mImageView;
    private static final int IMAGE_PICK_CODE = 1000;

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

        mFirstName = findViewById(R.id.first_name_input);
        mLastName = findViewById(R.id.last_name_input);
        AboutMissingSpinner = findViewById(R.id.spinner_about_missing);
        mAge = findViewById(R.id.age_input);
        mDescription = findViewById(R.id.description_input);

        mInsertImage = findViewById(R.id.insert_image);
        mImageView = findViewById(R.id.imageView);


        mInsertImage.setOnClickListener(v -> pickImageFromGallery());
    }

    private void pickImageFromGallery() {
        Intent i = new Intent();
        i.setType("image/*");
        i.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(i, IMAGE_PICK_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if (resultCode == RESULT_OK && requestCode == IMAGE_PICK_CODE) {
            assert data != null;
            imageUri = data.getData();
            mImageView.setImageURI(data.getData());
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    private void insertPerson() {
        firstNameString = Objects.requireNonNull(mFirstName.getText()).toString().trim();
        lastNameString = Objects.requireNonNull(mLastName.getText()).toString().trim();
        ageString = Objects.requireNonNull(mAge.getText()).toString().trim();
        descriptionString = Objects.requireNonNull(mDescription.getText()).toString().trim();

        if (TextUtils.isEmpty(lastNameString)) {
            lastNameString = "";
        }

        if (TextUtils.isEmpty(firstNameString) && TextUtils.isEmpty(lastNameString)
                && TextUtils.isEmpty(ageString) && TextUtils.isEmpty(descriptionString)) {
            return;
        }

        uploadImage();
    }

    private void uploadImage() {
        long timestamp = System.currentTimeMillis();
        String filePathAndName = "images/" + timestamp;

        StorageReference storageReference = FirebaseStorage.getInstance().getReference(filePathAndName);
        storageReference.putFile(imageUri)
                .addOnSuccessListener(taskSnapshot -> {
                    Task<Uri> uriTask = taskSnapshot.getStorage().getDownloadUrl();
                    while (!uriTask.isSuccessful());
                    String uploadedImageUri = "" + uriTask.getResult();
                    sendList(uploadedImageUri, timestamp);
                }).addOnFailureListener(e -> {

                });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu_add_person, menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.action_save) {
            insertPerson();
            finish();
            return true;
        } else if (item.getItemId() == android.R.id.home) {
            if (TextUtils.isEmpty(firstNameString) && TextUtils.isEmpty(lastNameString)
                    && TextUtils.isEmpty(ageString) && TextUtils.isEmpty(descriptionString)) {
            }

            showUnsavedChangesDialog();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private void sendList(String uploadedImageUri, long timestamp) {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("List");
        HashMap<String, Object> hashMap = new HashMap<>();

        hashMap.put("firstName", firstNameString);
        hashMap.put("lastName", lastNameString);
        hashMap.put("age", ageString);
        hashMap.put("description", descriptionString);
        hashMap.put("url", uploadedImageUri);
        hashMap.put("timestamp", timestamp);

        reference.push().setValue(hashMap);
    }
}

Upvotes: 0

Views: 215

Answers (1)

Alex Mamo
Alex Mamo

Reputation: 138824

As also @FrankvanPuffelen mentioned in his comment, the problem is indeed at the following lines of code:

while (!uriTask.isSuccessful());

When you add a ; (semicolon) at the end of the line it means that the while statement has nobody. It's true that you can create a body and move the corresponding lines of code inside it, but it will not behave as an if statement. So to solve this, you should use the following lines of code:

StorageReference storageReference = FirebaseStorage.getInstance().getReference(filePathAndName);
UploadTask uploadTask = storageReference.putFile(imageUri);

Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
    @Override
    public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
        if (!task.isSuccessful()) {
            throw task.getException();
        }

        // Continue with the task to get the download URL
        return ref.getDownloadUrl();
    }
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
    @Override
    public void onComplete(@NonNull Task<Uri> task) {
        if (task.isSuccessful()) {
            Uri uploadedImageUri = task.getResult().toString();
            long timestamp = System.currentTimeMillis();
            sendList(uploadedImageUri, timestamp);
        } else {
            Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
        }
    }
});

Upvotes: 1

Related Questions