【问题标题】:Images are not loading from the Firebase Storage图片未从 Firebase 存储加载
【发布时间】:2020-09-02 01:36:52
【问题描述】:

我正在使用 Firebase 存储的新方法 listAll(); 列出从我的存储到我的应用程序的所有图像,但图像没有加载到我的应用程序中并显示一个空白屏幕。我不知道是什么导致了这个错误。

我的活动课:

public class Events_and_Participations extends AppCompatActivity {

    StorageReference reference;
    RecyclerView recyclerView;
    Images_Adapter adapter;
    List<Task<Uri>> items = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_events_and_participations);
        Objects.requireNonNull(getSupportActionBar()).setTitle(R.string.item_title_4);

        reference = FirebaseStorage.getInstance().getReference("Events & Participations");

        reference.listAll()
                .addOnSuccessListener(this, listResult -> {

                    for (StorageReference item : listResult.getItems()) {
                        items.add(item.getDownloadUrl());
                    }
                })
                .addOnFailureListener(e -> Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show());

        adapter = new Images_Adapter(items);
        recyclerView = findViewById(R.id.events_photos);
        recyclerView.setAdapter(adapter);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
    }
}

我的图像适配器类:

public class Images_Adapter extends RecyclerView.Adapter<Images_Adapter.Images_VH> {

    private List<Task<Uri>> items;

    Images_Adapter(List<Task<Uri>> items) {
        this.items = items;
    }

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

    @Override
    public void onBindViewHolder(@NonNull Images_VH holder, int position) {
        Task<Uri> item = items.get(position);
        Picasso.get()
                .load(item.getResult())
                .resize(250,250)
                .centerCrop()
                .into(holder.imageView);
    }

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

    static class Images_VH extends RecyclerView.ViewHolder{
        ImageView imageView;

        Images_VH(@NonNull View itemView) {
            super(itemView);

            imageView = itemView.findViewById(R.id.ImageItem);
        }
    }
}

这些是我的 Firebase 存储规则:

rules_version = '2';
service firebase.storage {
  match /b/sahrudhaya-foundation.appspot.com/o {
    match /{allPaths=**} {
      allow read, write :if request.auth != null;
    }
  }
}

它会抛出“用户无权访问这些项目”的错误类型

我完全糊涂了,这是我的第一次尝试。希望对此有所帮助。

【问题讨论】:

    标签: java android firebase google-cloud-firestore firebase-storage


    【解决方案1】:

    尝试替换request.auth!=null withauth!=null`。看看这是否有效。

    【讨论】:

      【解决方案2】:

      实际上,我正在回答我自己的问题,因为将来有人会发现它很有用。

      如果有人想在没有身份验证的情况下加载图像,请将特定文件夹的安全规则更改为公共。例如,假设您有一个名为 images 的文件夹,其中包含所有图像现在转到您的存储规则并写入

      rules_version = '2';
      service firebase.storage {
        match /b/sahrudhaya-foundation.appspot.com/o {
          match /{allPaths=**} {
            
             match /images/{allPaths=**} {
                allow read, write: if true;
             }
          }
        }
      }
      

      然后该特定文件夹将是公开的,因此您无需身份验证即可访问所有图像。

      如果您想获取下载链接,请使用此代码。

      List<Strings> items = new ArrayList();
      
      reference = FirebaseStorage.getInstance().getReference("YOUR_FOLDER_NAME");
          
                  reference.listAll()
                          .addOnSuccessListener(this, listResult -> {
          
                              for (StorageReference item : listResult.getItems()) {
                                  items.clear(); //To clear all the previous stored strings. 
                                  item.getDownloadUrl().addOnCompleteListener(task -> {
                                  items.add(task.getResult()).toString());
                              });
                                 
                              }
                          })
                          .addOnFailureListener(e -> Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show());
      

      【讨论】:

      • Rajnish Sharma 很高兴你
      猜你喜欢
      • 2016-09-29
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      相关资源
      最近更新 更多