Retrive Image from Firebase to show in my Imageview

社会主义新天地 提交于 2020-01-06 05:17:50

问题


I'm looking forward to Display the images stored in Firebase Storage with refrence from Firebase Database.

Below is my Firebase Data Structure

and my Storage Structure is

Below is my code of Recycle adapter, I'm using to retrive images from Firebase

public class SubjectBooksAdapter extends RecyclerView.Adapter<SubjectBooksAdapter.MyViewHolder> {
    ArrayList<Books> bookslist;
    CardView cv;
    FirebaseAuth fauth;
    FirebaseDatabase database;
    DatabaseReference dbreference;
    Books b;

    public SubjectBooksAdapter(ArrayList<Books> bookslist){
        this.bookslist = bookslist;
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {

        TextView bookName,bookAuthor,bookDesc,bookPrice,bookCall;
        ImageView iv;

        MyViewHolder(final View itemView) {
            super(itemView);
            cv = (CardView) itemView.findViewById(R.id.my_card_view);

            iv = (ImageView) itemView.findViewById(R.id.imageView);

            database = FirebaseDatabase.getInstance();
            dbreference = database.getReference("books");
            bookName = (TextView) itemView.findViewById(R.id.bookName);
            bookAuthor = (TextView) itemView.findViewById(R.id.bookAuthor);
            bookDesc = (TextView) itemView.findViewById(R.id.bookDesc);
            bookPrice = (TextView) itemView.findViewById(R.id.bookPrice);
            bookCall = (TextView) itemView.findViewById(R.id.bookCall);
            fauth = FirebaseAuth.getInstance();
        }
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {

        database = FirebaseDatabase.getInstance();
        dbreference = database.getReference("books");

        b = bookslist.get(position);
        holder.bookName.setText(b.getBname());
        holder.bookAuthor.setText(b.getBauthor());
        holder.bookDesc.setText(b.getBdesc());
        holder.bookPrice.setText("Rs. "+b.getPrice());
        holder.bookCall.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Log.e("Current user is ", fauth.getCurrentUser().getEmail());
                b = bookslist.get(position);
                String[] arr = {b.getSelleremail(),b.getSellername(),b.getBname(),b.getBauthor()};
                //Log.e("Seller is ",b.getSellername());
                Intent in = new Intent(v.getContext(),Chat.class);
                in.putExtra("seller",arr);
                v.getContext().startActivity(in);
            }
        });
        Glide.with(cv.getContext()).load(Uri.parse(b.getPics())).placeholder(R.drawable.bshelf).error(R.drawable.bshelf).into(holder.iv);

    }

    @Override
    public int getItemCount() {
        return bookslist.size();
    }
}

But it shows every other details but don't show the image...Here is the screenshot

It thus shows the default bshelf.png from drawable folder.


回答1:


Replace your pic with a download url from your firebase storage. When saving an image, you should get the download url of an image from firebase storage.

EDIT:

In your onActivityResult()

private byte[] imageByte;

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == CAMERA_REQUEST_CODE && resultCode == RESULT_OK) {
        filePath = data.getData();
        iv1.setImageURI(filePath);
    }
    if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
        CropImage.ActivityResult result = CropImage.getActivityResult(data);
        if (resultCode == RESULT_OK) {
            Uri resultUri = result.getUri();

            iv1.setImageURI(resultUri);
            imageByte = uriToByteArray(resultUri);

        } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
            Exception error = result.getError();
        }
    }
}

public byte[] uriToByteArray(Uri uri) {
InputStream iStream =   getContentResolver().openInputStream(uri);

     ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
    int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];

    int len = 0;
    while ((len = iStream.read(buffer)) != -1) {
        byteBuffer.write(buffer, 0, len);
    }
    return byteBuffer.toByteArray();
}

and in class t2 extends AsyncTask:

        @Override
    protected Boolean doInBackground(final String... bookid) {
        if(filePath != null) {
            storageRef =  mStorageRef.child(bookid[0]);
        UploadTask uploadTask = storageRef.putBytes(imageByte);

    uploadTask.addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {

                storageReference.getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
                    @Override
                    public void onComplete(@NonNull Task<Uri> task) {
                        String download_url = task1.getResult().toString();
                  }
            });


             }
         });
}

And when you want to show the image:

Books b = list.get(position);
Glide.load(b.getPics);

I didn't test it but i think that's a better approach when saving an image to firebase. Hope it helps




回答2:


Try this:

public class ShowImagesActivity extends AppCompatActivity {
//recyclerview object
private RecyclerView recyclerView;

//adapter object
private RecyclerView.Adapter adapter;

//database reference
private DatabaseReference mDatabase;

//progress dialog
private ProgressDialog progressDialog;

//list to hold all the uploaded images
private List<Upload> uploads;

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


    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));


    progressDialog = new ProgressDialog(this);

    uploads = new ArrayList<>();

    //displaying progress dialog while fetching images
    progressDialog.setMessage("Please wait...");
    progressDialog.show();
    mDatabase = FirebaseDatabase.getInstance().getReference(Constants.DATABASE_PATH_UPLOADS);

    //adding an event listener to fetch values
    mDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            //dismissing the progress dialog 
            progressDialog.dismiss();

            //iterating through all the values in database
            for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                Upload upload = postSnapshot.getValue(Upload.class);
                uploads.add(upload);
            }
            //creating adapter
            adapter = new MyAdapter(getApplicationContext(), uploads);

            //adding adapter to recyclerview
            recyclerView.setAdapter(adapter);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            progressDialog.dismiss();
        }
    });

}
}

Please open this link it is very useful to you:

https://www.simplifiedcoding.net/firebase-storage-example/



来源:https://stackoverflow.com/questions/52107266/retrive-image-from-firebase-to-show-in-my-imageview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!