我正在使用 Firebase Storage 的新方法 listAll();
列出存储中的所有图像到我的应用,但图像未加载到我的应用中并显示空屏幕。我不知道是什么原因导致这个错误。
我的 Activity 类(class):
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;
}
}
}
它抛出错误类型“用户无权访问该项目”
我完全困惑了,这是我的第一次尝试。希望对此有所帮助。
最佳答案
实际上,我正在回答我自己的问题,因为将来有人会发现它有用。
如果有人想在没有身份验证的情况下加载图像,请将该特定文件夹的安全规则更改为公开。例如,假设您有一个名为 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());
关于java - 图像未从 Firebase 存储加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61832589/