Search code examples
javaandroidfirebasefirebase-realtime-databasepicasso

How can I get the image that stored in Firebase Database with the help of Picasso


I'am trying to code an application that you can post some photos and texts. I'm okey with getting texts from firebase database however ı cannot access the images that is stored in Storage part of the Firebase (I also added them into database). Images couldn't be loaded and when I checked the logcat, Picasso says that

Unrecognized type of request: Request{com.google.android.gms.tasks.zzu@78d7d49}

So i cannot give the download url of the image because images are stored in database as a string like com.google.android.gms.tasks.zzu@78d7d49

How can I access them ?

 public static class BlogViewHolder extends RecyclerView.ViewHolder {

        View mView;

        public BlogViewHolder(@NonNull View itemView) {
            super(itemView);
            mView = itemView;
        }

        public void setTitle(String title) {
            TextView post_title = (TextView) mView.findViewById(R.id.post_title);
            post_title.setText(title);
        }

        public void setDesc(String desc) {
            TextView post_text = (TextView) mView.findViewById(R.id.post_text);
            post_text.setText(desc);
        }

        public void setImage(Context ctx, String image) {
            final ImageView post_image = (ImageView) mView.findViewById(R.id.post_image);
           // Glide.with(ctx).load(image).into(post_image);

            Picasso.get().setLoggingEnabled(true);
            Picasso.get().load(image).into(post_image);

//            StorageReference load = FirebaseStorage.getInstance().getReference().child("Images").child(image);
//            load.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
//                @Override
//                public void onSuccess(Uri uri) {
//                    Picasso.get().load(uri.toString()).into(post_image);
//                }
//            });



        }
    }
 @Override
    protected void onStart() {
        super.onStart();

        FirebaseRecyclerOptions<Images> firebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<Images>()
                .setQuery(mData, Images.class)
                .build();

        FirebaseRecyclerAdapter<Images, BlogViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Images, BlogViewHolder>(firebaseRecyclerOptions) {



            @Override
            protected void onBindViewHolder(@NonNull BlogViewHolder blogViewHolder, int i, @NonNull Images blog) {
                blogViewHolder.setTitle(blog.getTitle());
                blogViewHolder.setDesc(blog.getDesc());
                blogViewHolder.setImage(getApplicationContext(), blog.getImage());
            }

            @NonNull
            @Override
            public BlogViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.blog_row, parent, false);
                return new BlogViewHolder(view);
            }
        };

        firebaseRecyclerAdapter.startListening();
        mMainList.setAdapter(firebaseRecyclerAdapter);

    }
public class Images {

    private String desc;
    private String image;
    private String title;

    public Images(String desc, String image, String title) {
        this.desc = desc;
        this.image = image;
        this.title = title;
    }

    public Images() {

    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}


Solution

  • Make sure that your image is url format like this "https://firebasestorage.googleapis.com/v0/b/burnab-812eb.appspot.com/o/users%2Fprofile_images%2Fzyp599FGT5NJvTSC0YbKJJRWjqX2.jpg?alt=media&token=8b7a1399-9217-40dd-8a05-49f9b7b7420f"

    This way Picasso will able to fetch the image from database.

    If you don't have a download url from storage. Then you can achieve this below

    final StorageReference childRef = storageReference.child("posts/" + user_id + "/" + ts + ".jpg");
    
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                compressedImageFile.compress(Bitmap.CompressFormat.JPEG, 18, baos);
                byte[] thumbData = baos.toByteArray();
    
    
                final UploadTask thumb_uploadTask = thumb_childRef.putBytes(thumbData);
    
                thumb_uploadTask.addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                        if (task.isSuccessful()) {
                            Task<Uri> thumb_uriTask = thumb_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();
                                    }
                                    return thumb_childRef.getDownloadUrl();
                                }
                            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                                @Override
                                public void onComplete(@NonNull Task<Uri> task) {
                                    if (task.isSuccessful()) {
    
                                      Uri downloadUri = task.getResult();
    
                                                                final String mUri = downloadUri.toString();
                                                                final HashMap<Object, Object> dataMap = new HashMap<>();
                                                                dataMap.put("profile_image", profile_image);
    
                                                                if (bundle != null) {
                                                                    group_id = bundle.getString("group_id");
                                                                    dataMap.put("group_id", group_id);
                                                                    mDatabase.child("group").child(group_id).child("posts").push().setValue(dataMap).addOnCompleteListener(new OnCompleteListener<Void>() {
                                                                        @Override
                                                                        public void onComplete(@NonNull Task<Void> task) {
                                                                            if (task.isSuccessful()) {
                                                                                pd.dismiss();
                                                                                Toast.makeText(getApplicationContext(), "Post added successfully", Toast.LENGTH_LONG).show();
                                                                                onBackPressed();
                                                                            } 
                                                                        }
                                                                    });
                                    }
                                }
                            });
                        }
    
                    }
                });