【问题标题】:Retriving image from firebase into recycler view in android studio将图像从firebase检索到android studio中的recyclerview
【发布时间】:2020-07-24 11:22:42
【问题描述】:

我正在尝试从 firebase 数据库中检索图像(图像在存储中)。 我无法将其转换为 url 以将其传递给 picasso 以将其加载到回收站视图中。如果从同一设备上载和检索,但图像未显示在其他设备上,它可以工作。任何帮助几乎都会派上用场。 我正在尝试使用 Firebase 存储和检索图像。存储图像时可以,但我无法在 ImageView 中显示它。它没有给出错误,所以我不明白错误在哪里。 我提供了所需的权限。

谢谢你。 Mainactivity.java

package com.example.blogger;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.squareup.picasso.Picasso;

public class blogupload extends AppCompatActivity {
    private RecyclerView mBlogList;
    private DatabaseReference mDataBase;
    private FirebaseAuth mAuth=FirebaseAuth.getInstance();
    FirebaseRecyclerAdapter adapter;
    
    @Override
    protected void onStart() {
        super.onStart();
        FirebaseRecyclerOptions<Blog> options =
                new FirebaseRecyclerOptions.Builder<Blog>()
                        .setQuery(mDataBase,Blog.class)
                        .build();

        adapter = new FirebaseRecyclerAdapter<Blog, BlogViewHolder>(options) {
            @Override
            public BlogViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.blog_row, parent, false);

                return new BlogViewHolder(view);
            }

            @Override
            protected void onBindViewHolder(BlogViewHolder holder, int position, Blog model) {
                holder.setTitle(model.getTitle());
                holder.setDesc(model.getDesc());
                holder.setImage(model.getImage());
            }


        };
        adapter.startListening();
        mBlogList.setAdapter(adapter);




    }
    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 ;
            post_title=(TextView) mView.findViewById(R.id.post_title);
            post_title.setText(title);

        }

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

        }

        public void setImage(String image)
        {
            ImageView post_image;
            post_image=(ImageView) mView.findViewById(R.id.post_image);

            Picasso.get().load(image).into(post_image);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater=getMenuInflater();
        inflater.inflate(R.menu.action_menu,menu);
        return true;
    }

    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }

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

        mDataBase= FirebaseDatabase.getInstance().getReference().child("blog");

        mBlogList=(RecyclerView) findViewById(R.id.blog_list);
        mBlogList.setLayoutManager(new LinearLayoutManager(this));

    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.add:
                Intent intent = new Intent(getApplicationContext(), addpostactivity.class);
                startActivity(intent);
                return true;
            case R.id.logout:
                mAuth.signOut();
                Intent intent1 =new Intent(getApplicationContext(),MainActivity.class);
                startActivity(intent1);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }

    }
}

图片上传活动

package com.example.blogger;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;
import com.squareup.picasso.Picasso;

import java.util.Random;

public class addpostactivity extends AppCompatActivity
{

    private static final int MAX_LENGTH = 23 ;
    ProgressBar mProgress;
    ImageView selectimage;
    TextView posttitle,postdesc;
    Button submitbtn;
    private Uri uri;
    private static final int GALLERY_INTENT=2;
    private StorageReference mStorage;
    private DatabaseReference mDataBase;
    private FirebaseAuth mAuth;
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode==GALLERY_INTENT&&resultCode==RESULT_OK)
        {
            uri=data.getData();
            Picasso.get().load(uri).into(selectimage);

        }
    }


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

        selectimage=(ImageView) findViewById(R.id.selectimage);
        posttitle=(TextView) findViewById(R.id.posttitle);
        postdesc=(TextView) findViewById(R.id.postdesc);
        submitbtn=(Button) findViewById(R.id.submitbtn);

        mProgress= new ProgressBar(this);

        mDataBase= FirebaseDatabase.getInstance().getReference().child("blog");


        submitbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startposting();


                
            }
        });
        
        
        selectimage.setVisibility(View.VISIBLE);
        mStorage= FirebaseStorage.getInstance().getReference();

        selectimage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent =new Intent(Intent.ACTION_PICK);
                intent.setType("image/w");
                startActivityForResult(intent,GALLERY_INTENT);
            }
        });




    }
    public static String random() {
        Random generator = new Random();
        StringBuilder randomStringBuilder = new StringBuilder();
        int randomLength = generator.nextInt(MAX_LENGTH);
        char tempChar;
        for (int i = 0; i < randomLength; i++){
            tempChar = (char) (generator.nextInt(96) + 32);
            randomStringBuilder.append(tempChar);
        }
        return randomStringBuilder.toString();
    }

    private void startposting() 
    {

        mProgress.setProgress(0);
        mProgress.setVisibility(View.VISIBLE);

        String title_value=posttitle.getText().toString().trim();
        String desc_value=postdesc.getText().toString().trim();
        if(!TextUtils.isEmpty(title_value)  &&  !TextUtils.isEmpty(desc_value)  &&  uri!=null)
        {
            StorageReference filepath=mStorage.child("blog_image").child(random());
            //adding a picture to storage

            filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    Toast.makeText(getApplicationContext(),"Uploaded",Toast.LENGTH_SHORT).show();
                }
            });


        }

        DatabaseReference newPost=mDataBase.push();
        //newPost.child("uid").setValue(mAuth.getCurrentUser().getUid());
        newPost.child("title").setValue(title_value);
        newPost.child("desc").setValue(desc_value);
        newPost.child("image").setValue(uri.toString());

        Intent intent = new Intent(getApplicationContext(), blogupload.class);
        startActivity(intent);
    }

}

【问题讨论】:

  • 你能在浏览器中打开图片网址吗??只需使用 System.out.println(image) 打印 url;如果它没有在浏览器中打开,则意味着您的图片网址有问题。
  • @TusharLathiya No
  • 没有 url 怎么加载?你能得到标题和描述吗?
  • @TusharLathiya 是的
  • 我认为您需要检查 Firebase 响应并需要检查图片网址。如果可能,分享回复。

标签: java android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

据我所知,问题出在您的这部分代码中:

if(!TextUtils.isEmpty(title_value)  &&  !TextUtils.isEmpty(desc_value)  &&  uri!=null)
{
    StorageReference filepath=mStorage.child("blog_image").child(random());
    //adding a picture to storage

    filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            Toast.makeText(getApplicationContext(),"Uploaded",Toast.LENGTH_SHORT).show();
        }
    });


}

DatabaseReference newPost=mDataBase.push();
//newPost.child("uid").setValue(mAuth.getCurrentUser().getUid());
newPost.child("title").setValue(title_value);
newPost.child("desc").setValue(desc_value);
newPost.child("image").setValue(uri.toString());

您传递给filepath.putFile(uri)uri 是您要上传到存储的Android 设备上本地的路径。然后你在newPost.child("image").setValue(uri.toString()) 中写入数据库的本地 路径。但由于路径是 Android 设备的本地路径,因此无法在其他设备上运行。

您需要获取上传文件的下载 URL,并将其写入数据库。根据uploading a file 上的文档,大概是这样的:


StorageReference filepath=mStorage.child("blog_image").child(random());
filepath.putFile(uri).continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {

addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        Toast.makeText(getApplicationContext(),"Uploaded",Toast.LENGTH_SHORT).show();
        return filepath.getDownloadUrl();
    }
}).addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void OnSuccessListener(@NonNull Uri uri) {
        DatabaseReference newPost=mDataBase.push();
        newPost.child("title").setValue(title_value);
        newPost.child("desc").setValue(desc_value);
        newPost.child("image").setValue(uri.toString());
    }
});

注意的区别:

  • 写入数据库的代码onSuccess 侦听器中,因为一旦图像上传到存储,就会调用它。
  • 我们现在调用 getDownloadUrl 来确定下载 URL,这是 Cloud Storage 中任何人都可以用来访问其数据的文件的 URL。
  • 由于getDownloadUrl 也是一个异步调用,我们有一个continueWith 调用来链接异步任务。我们也可以嵌套完成侦听器,但这是文档所做的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-06
    • 2021-06-30
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2017-08-25
    • 1970-01-01
    相关资源
    最近更新 更多