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); } }
while (!uriTask.isSuccessful());is a bad practice. Instead, use the code from the documentation or this answer to get the download URL.