0

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); } } 
1
  • 2
    This while (!uriTask.isSuccessful()); is a bad practice. Instead, use the code from the documentation or this answer to get the download URL. Commented Oct 29, 2021 at 16:29

1 Answer 1

1

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! } } }); 
Sign up to request clarification or add additional context in comments.

Comments