从特定文件夹中获取随机图像

Get random images from specific folder

我有一个 android 应用程序可以从我的外部存储中生成 3 个随机图像。然后将我得到的随机图像设置为正在工作的 Imageview。问题是我不想查看每张图片,而只是从外部文件夹中的一个特定文件夹中获取随机图像。我如何更改代码以获取此代码?

public class SuggestedOutfit extends AppCompatActivity{

public ImageView shirts;
public ImageView pants;
public ImageView shoes;
Button reload;
private Bitmap currentBitmap = null;
String[] projection = new String[]{
        MediaStore.Images.Media.DATA,
};


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.suggested_outfit);
    shirts = (ImageView)findViewById(R.id.shirtImage);
    pants = (ImageView)findViewById(R.id.pantsImage);
    shoes = (ImageView)findViewById(R.id.shoesImage);

    shirts.setImageBitmap(getImage());
    pants.setImageBitmap(getImage());
    shoes.setImageBitmap(getImage());

    reload = (Button)findViewById(R.id.getNewOutfit);
    reload.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            finish();
            startActivity(getIntent());
        }
    });
}


public Bitmap getImage () {
    Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    Cursor cur = getContentResolver().query(images,
            projection,"", null, ""
    );
    final ArrayList<String> imagesPath = new ArrayList<String>();
    if (cur.moveToFirst()) {

        int dataColumn = cur.getColumnIndex(
                MediaStore.Images.Media.DATA);
        do {
            imagesPath.add(cur.getString(dataColumn));
        } while (cur.moveToNext());
    }
    cur.close();
    final Random random = new Random();
    final int count = imagesPath.size();
    int number = random.nextInt(count);
    String path = imagesPath.get(number);
    currentBitmap = BitmapFactory.decodeFile(path);

    return currentBitmap;
}

}

我有 2 种方法可以想到,您几乎已经掌握了所有方法:

  1. 就这一行:

    imagesPath.add(cur.getString(dataColumn));

您必须添加一个过滤器,以便仅在值是您想要的值时才添加到数组中。例如:

do {
   String path = cur.getString(dataColumn);
   if(path.contains("/wardrobe/")){
      imagesPath.add(path);
   }
} while (cur.moveToNext());

您也许可以使 if 更复杂一些,以确保不会遇到任何奇怪的边缘情况,但仅此而已。只有你想要的地方的图像被添加到数组中,然后你随机选择一个。

  1. 或者您也可以将适当的查询参数传递给 getContentResolver().query 而不是简单地传递 "",

类似于:

 getContenteResolver().query(
   images,
   projection,
   MediaStore.Images.Media.DATA + " contains /wardrobe/",
   null,
   "");

ps:(上面的这个SQL语句只是一个例子,它不会起作用,因为它没有正确转义,它只是指向正确的方向,以防你想在 SQL 查询中实现它)

但我个人会使用第一种方法。