I want to store a uri to my donation.java class so that ill be able to fetch an image from firebase storage and display it on a cardview. However uri.toString is highlighted red and shows a “Cannot resolve constructor ‘donation(java.lang.String)'”
donate.java
package com.example.byete_hunger_mobileapp; import androidx.activity.result.ActivityResult; import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.cardview.widget.CardView; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.recyclerview.widget.RecyclerView; import android.app.Activity; import android.app.Dialog; import android.content.ContentResolver; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.media.Image; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.webkit.MimeTypeMap; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import com.example.byete_hunger_mobileapp.databinding.ActivityDonateBinding; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.android.gms.tasks.Task; import com.google.android.material.snackbar.Snackbar; 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.FileDownloadTask; 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.File; import java.io.IOException; import java.net.URI; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Random; import java.util.Timer; import java.util.TimerTask; import java.util.UUID; public class donate extends AppCompatActivity { Spinner spinner; Button Submit; ImageView back, account, chooseImage; EditText weight, datePurchased, dateExpired, contactNo, notes; DatabaseReference dbRef; FirebaseStorage storage; StorageReference storageRef; FirebaseAuth fAuth; FirebaseUser currentUser; RecyclerView recyclerView; Timer timer; ActivityResultLauncher<String> launcher; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_donate); chooseImage = findViewById(R.id.donate_uploadImage); back = findViewById(R.id.donate_back_button); account = findViewById(R.id.donate_account_page_icon); recyclerView = findViewById(R.id.rv_donationstracker); spinner = findViewById(R.id.spinner_donate); weight = findViewById(R.id.et_donate_weight); datePurchased = findViewById(R.id.et_donate_donatePurchased); dateExpired = findViewById(R.id.et_donate_donateExpired); contactNo = findViewById(R.id.et_donate_contactNo); notes = findViewById(R.id.et_donate_notes); Submit = findViewById(R.id.button4_donate_submit); fAuth = FirebaseAuth.getInstance(); currentUser = fAuth.getCurrentUser(); dbRef = FirebaseDatabase.getInstance().getReference(); storage = FirebaseStorage.getInstance(); storageRef = storage.getReference(); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.DonationType, android.R.layout.simple_spinner_dropdown_item); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinner.setAdapter(adapter); back.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); account.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(donate.this, Account.class)); } }); //choose image in files chooseImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { launcher.launch("image/*"); } }); launcher = registerForActivityResult(new ActivityResultContracts.GetContent(), new ActivityResultCallback<Uri>() { @Override public void onActivityResult(Uri result) { chooseImage.setImageURI(result); Submit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { InsertData(); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { finish(); } }, 1000); } public void InsertData() { String type = spinner.getSelectedItem().toString(); String wt = weight.getText().toString(); String dP = datePurchased.getText().toString(); String dE = dateExpired.getText().toString(); String cN = contactNo.getText().toString(); String nts = notes.getText().toString(); String id = dbRef.push().getKey(); String imageUrl = ""; //show when new card was added to donations Date date = new Date(); Date time = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("dd MMMM yyyy"); SimpleDateFormat formatter2 = new SimpleDateFormat("hh:mm:ss"); String dateAdded = formatter.format(date); String dateAddedTime = formatter2.format(time); donation Donation = new donation(type, wt, dP, dE, cN, nts, id, dateAdded, dateAddedTime,imageUrl); dbRef.child("Users").child(currentUser.getUid()).child("donation").child(id).setValue(Donation).addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if(task.isSuccessful()){ Toast.makeText(donate.this,"Donation details inserted", Toast.LENGTH_LONG).show(); } } }); // firebase storage folder location StorageReference riversRef = storageRef.child("images/").child(currentUser.getUid()).child(date.toString()); // uploads image to firebase storage riversRef.child(id + "." + GetFileExtension(result)).putFile(result).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { riversRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { @Override public void onSuccess(Uri uri) { donation image = new donation(uri.toString()); dbRef.child("Users").child(currentUser.getUid()).child("donation").child(id).child("image").setValue(image); } }); Toast.makeText(getApplicationContext(), "Image Uploaded.", Toast.LENGTH_LONG).show(); } }).addOnFailureListener(exception -> Toast.makeText(getApplicationContext(), "Failed to Upload Image.", Toast.LENGTH_LONG).show()); } }); } }); } public String GetFileExtension(Uri uri){ ContentResolver contentResolver = getContentResolver(); MimeTypeMap map = MimeTypeMap.getSingleton(); return map.getExtensionFromMimeType(contentResolver.getType(uri)); } }
donation.java
package com.example.byete_hunger_mobileapp; import android.net.Uri; import com.google.android.gms.tasks.Task; public class donation { private String type, weight, datePurchased, dateExpired, contactNo, notes, id, dateAdded, dateAddedTime, imageUrl; public donation() { } public donation(String type, String weight, String datePurchased, String dateExpired, String contactNo, String notes, String id, String dateAdded, String dateAddedTime, String imageUrl) { this.type = type; this.weight = weight; this.datePurchased = datePurchased; this.dateExpired = dateExpired; this.contactNo = contactNo; this.notes = notes; this.id = id; this.dateAdded = dateAdded; this.dateAddedTime = dateAddedTime; this.imageUrl = imageUrl; } public String getType() {return type;} public String getWeight() { return weight; } public String getDatePurchased() {return datePurchased;} public String getDateExpired() { return dateExpired; } public String getContactNo() { return contactNo; } public String getNotes() { return notes; } public String getId() { return id; } public String getDateAdded() { return dateAdded; } public String getDateAddedTime() { return dateAddedTime; } public String getImageUrl() { return imageUrl; } }
I’ve tried storing the uri to a different class which was successful but I had to make another list for myAdapter which added more problems to the table.
MyAdapter.java
package com.example.byete_hunger_mobileapp; import android.content.Context; import android.content.Intent; import android.transition.AutoTransition; import android.transition.TransitionManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.cardview.widget.CardView; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import java.util.ArrayList; import java.util.List; public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { Context context; ArrayList<donation> list; public MyAdapter(Context context, ArrayList<donation> list) { this.context = context; this.list = list; } @NonNull @Override public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View v = LayoutInflater.from(context).inflate(R.layout.donation_card, parent, false); return new MyAdapter.MyViewHolder(v); } @Override public void onBindViewHolder(@NonNull MyAdapter.MyViewHolder holder, int position) { donation Donation = list.get(position); holder.type.setText(Donation.getType()); holder.weight.setText(Donation.getWeight()); holder.datePurchased.setText(Donation.getDatePurchased()); holder.dateExpired.setText(Donation.getDateExpired()); holder.notes.setText(Donation.getNotes()); holder.id.setText(Donation.getId()); holder.dateAdded.setText(Donation.getDateAdded()); holder.dateAddedTime.setText(Donation.getDateAddedTime()); Glide.with(context).load(Donation.getImageUrl()).into(holder.donationCardImage); } @Override public int getItemCount() { return list.size(); } public class MyViewHolder extends RecyclerView.ViewHolder { TextView type, weight, datePurchased, dateExpired, notes, id, dateAdded, dateAddedTime; Button track; CardView cardView; ImageView donationCardImage; RelativeLayout donationcardcontent; public MyViewHolder(@NonNull View itemView) { super(itemView); type = itemView.findViewById(R.id.tv_donationcard_typedesc); weight = itemView.findViewById(R.id.tv_donationcard_weightdesc); datePurchased = itemView.findViewById(R.id.tv_donationcard_dateofpurchasedesc); dateExpired = itemView.findViewById(R.id.tv_donationcard_expirationdatedesc); notes = itemView.findViewById(R.id.tv_donationcard_notesdesc); id = itemView.findViewById(R.id.tv_donationcard_uidCode); dateAdded = itemView.findViewById(R.id.tv_donationcard_dateadded); dateAddedTime = itemView.findViewById(R.id.tv_donationcard_dateaddedTime); donationCardImage = itemView.findViewById(R.id.iV_donationcard); track = itemView.findViewById(R.id.btn_donationcard_track); cardView = itemView.findViewById(R.id.cv_donationCard); donationcardcontent = itemView.findViewById(R.id.rl_donationcard_content); track.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(cardView.getContext(),statustracker.class); cardView.getContext().startActivity(intent); } }); // donation card expands and collapses cardView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (donationcardcontent.getVisibility() == View.GONE) { TransitionManager.beginDelayedTransition(cardView, new AutoTransition()); donationcardcontent.setVisibility(View.VISIBLE); } else if (donationcardcontent.getVisibility() != View.GONE) { TransitionManager.beginDelayedTransition(cardView, new AutoTransition()); donationcardcontent.setVisibility(View.GONE); } } }); } } }
So I want to know if there’s a possible work around for storing the uri to my donation class.
Advertisement
Answer
The line
donation image = new donation(uri.toString());
will create a new donation from String. Probably this is not what is wanted. If the goal is to set imageUrl
after the image is uploaded, then replace this line with:
Donation.setImageUrl(uri.toString());
And in donation.java, add setter for imageUrl:
public void setImageUrl(String url) { this.imageUrl = url; }