我们如何使用 MediaStore 类(ANDROID)获取所有包含图像的文件夹?

Posted

技术标签:

【中文标题】我们如何使用 MediaStore 类(ANDROID)获取所有包含图像的文件夹?【英文标题】:How do we get all folders containing images using MediaStore class (ANDROID)? 【发布时间】:2016-04-07 11:41:13 【问题描述】:

我使用 MediaStore 类来获取存储中的所有图像文件夹。 但问题是它显示同一个文件夹的次数与其中的图像数量一样多。

    public void getImageDirProvider()
    Uri uri= MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    String projection[]=MediaStore.Images.Media.BUCKET_DISPLAY_NAME,MediaStore.Images.Media.BUCKET_ID,MediaStore.Images.Media._ID;
    imageCursor=getActivity().getContentResolver().query(uri,projection,null,null,null);


    if (imageCursor!=null)
        while(imageCursor.moveToNext())

            bucketName.add(imageCursor.getString(0));
            bucketId.add(imageCursor.getString(1));
        
    

这里的bucketName和bucketId是String类型的ArrayList。

    @Override
    public int getCount() 
        return bucketName.size();
    

    @Override
    public Object getItem(int position) 
        return bucketName.get(position);
    

    @Override
    public long getItemId(int position) 
        return position;
    

    class Holder 
        ImageView iview;
        TextView tview;
    

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) 
        Holder hold = new Holder();

            convertView = layoutInflater.inflate(R.layout.my_list_adapter, parent, false);

            hold.tview = (TextView) convertView.findViewById(R.id.text_view_adapter);
            hold.iview = (ImageView) convertView.findViewById(R.id.image_view);

        hold.tview.setText(getItem(position).toString());
        hold.iview.setImageResource(android.R.drawable.ic_btn_speak_now);
        return convertView;
    

上面是扩展 BaseAdapter 类的 myCustomAdapter 类。

【问题讨论】:

@aribeiro。是的,我在包含 cardView 的片段中放置了一个 recyclerView。我在cardView上放了onClickListener()来显示第一组文件,使用java中的文件处理。之后我被卡住了,想着我还要使用多少片段,因为我不知道嵌套文件夹的数量。在我要访问文件的文件夹数量之后...... 如何使用文件处理获取所有包含图像的文件夹?必须有某种方式...从内部和 sdcard 存储中获取图像... @Prabh 使用内容提供者 【参考方案1】:

String projection[]=MediaStore.Images.Media.BUCKET_DISPLAY_NAME,MediaStore.Images.Media.BUCKET_ID,MediaStore.Images.Media._ID;

您查询每个可用图像,因此返回游标具有尽可能多的记录。因此,当您骑自行车时,您当然会收到重复的存储桶。 尝试从查询中排除图像并仅查询可用的存储桶,例如

String projection[]=MediaStore.Images.Media.BUCKET_DISPLAY_NAME,MediaStore.Images.Media.BUCKET_ID;

如果您仍然收到重复的值,请尝试 String projection[] = "DISTINCT " + MediaStore.Images.Media.BUCKET_DISPLAY_NAME, MediaStore.Images.Media.BUCKET_ID;

【讨论】:

它对我有用。谢谢。有没有办法在 listView 上添加一个 onItemClickListener() 并使用内容提供程序显示文件夹的内容,即其中的图像。 第一个问题实际上很容易被谷歌回答(评论不允许这么多代码)。第二 - 我不知道,在内容提供商方面没有太多经验 还有另一种删除重复存储桶的方法吗?因为我需要打开它们并访问其中的文件。所以我需要 MediaStore.Images.Media.DATA 列。

以上是关于我们如何使用 MediaStore 类(ANDROID)获取所有包含图像的文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以使用 MediaStore API 删除图像文件吗?如果是,那么如何

如何使用 Exoplayer 播放从 Mediastore 获取的视频

如何使用 MediaStore 在 Android Q 中保存图像?

Android MediaStore 插入视频

如何停止 MediaStore.ACTION_IMAGE_CAPTURE 复制图片

如何在 Android 上使用 MediaStore 将数据从相机保存到磁盘?