您好,我是Fresco的新手,我正尝试将手机中的所有图像加载到应用程序

当我使用此URI时:/storage/emulated/0/DCIM/Camera/20200206_222309.jpg

使用此代码:

ControllerListener listener = new BaseControllerListener();
DraweeController controller = Fresco.newDraweeControllerBuilder()
        .setUri(xuri)
        .setTapToRetryEnabled(true)
        .setControllerListener(listener)
        .build();
photosFragmentRecycler.setController(controller);


仅加载名称为20200206_222309.jpg的照片
如何加载所有图像?
提前致谢

最佳答案

您的问题不取决于所使用的图像库。您基本上希望获得所有摄像机图像的列表。
这样的事情应该会为您提供所有URI的列表:

    fun getMediaStoreUris(context: Context): List<Uri> {
        val uris = mutableListOf<Uri>()
        context.contentResolver.query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                arrayOf(MediaStore.Images.Media._ID),
                null,
                null,
                null)?.use {
            val dataIndex = it.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
            while (it.moveToNext()) {
                uris.add(
                        ContentUris.withAppendedId(
                                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                                it.getLong(dataIndex)))
            }
        }
        return uris
    }


然后,您只需创建一个简单的RecyclerView适配器和ViewHolder并使用Fresco加载图像:

  public class SimpleAdapter extends RecyclerView.Adapter<SimpleViewHolder> {

    private List<Uri> mUris;

    SimpleAdapter(List<Uri> uris) {
      mUris = uris;
      setHasStableIds(true);
    }

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

    @Override
    public void onBindViewHolder(SimpleViewHolder holder, int position) {
      holder.mSimpleDraweeView.setImageURI(mUris.get(position));
    }

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

    @Override
    public long getItemId(int position) {
      return mUris.get(position).hashCode();
    }

    public void setData(List<Uri> uris) {
      mUris = uris;
      notifyDataSetChanged();
    }
  }

  static class SimpleViewHolder extends RecyclerView.ViewHolder {

    private final SimpleDraweeView mSimpleDraweeView;

    SimpleViewHolder(View itemView) {
      super(itemView);
      mSimpleDraweeView = itemView.findViewById(R.id.drawee_view);
    }
  }


并使用适配器:

    final SimpleAdapter adapter = new SimpleAdapter(getMediaStoreUris(context));
    recyclerView.setAdapter(adapter);


Fresco在其Showcase示例应用程序中具有完整的示例:https://github.com/facebook/fresco/blob/9fde53f963d07495118c61ea2d9a3fce575afeb7/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/drawee/DraweeRecyclerViewFragment.java

如果您只允许访问您的应用程序的“应用程序信息”并手动允许它,那么如果您允许访问本地存储的权限(有指南here或对其进行测试),则此方法将起作用。

这是一个非常简单的解决方案,在实践中,您可能希望对媒体存储实现分页等。但这应该引导您朝着正确的方向前进。

09-04 23:26