从特定文件夹中获取随机图像
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 种方法可以想到,您几乎已经掌握了所有方法:
就这一行:
imagesPath.add(cur.getString(dataColumn));
您必须添加一个过滤器,以便仅在值是您想要的值时才添加到数组中。例如:
do {
String path = cur.getString(dataColumn);
if(path.contains("/wardrobe/")){
imagesPath.add(path);
}
} while (cur.moveToNext());
您也许可以使 if
更复杂一些,以确保不会遇到任何奇怪的边缘情况,但仅此而已。只有你想要的地方的图像被添加到数组中,然后你随机选择一个。
或者您也可以将适当的查询参数传递给 getContentResolver().query
而不是简单地传递 ""
,
类似于:
getContenteResolver().query(
images,
projection,
MediaStore.Images.Media.DATA + " contains /wardrobe/",
null,
"");
ps:(上面的这个SQL语句只是一个例子,它不会起作用,因为它没有正确转义,它只是指向正确的方向,以防你想在 SQL 查询中实现它)
但我个人会使用第一种方法。
我有一个 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 种方法可以想到,您几乎已经掌握了所有方法:
就这一行:
imagesPath.add(cur.getString(dataColumn));
您必须添加一个过滤器,以便仅在值是您想要的值时才添加到数组中。例如:
do {
String path = cur.getString(dataColumn);
if(path.contains("/wardrobe/")){
imagesPath.add(path);
}
} while (cur.moveToNext());
您也许可以使 if
更复杂一些,以确保不会遇到任何奇怪的边缘情况,但仅此而已。只有你想要的地方的图像被添加到数组中,然后你随机选择一个。
或者您也可以将适当的查询参数传递给
getContentResolver().query
而不是简单地传递""
,
类似于:
getContenteResolver().query(
images,
projection,
MediaStore.Images.Media.DATA + " contains /wardrobe/",
null,
"");
ps:(上面的这个SQL语句只是一个例子,它不会起作用,因为它没有正确转义,它只是指向正确的方向,以防你想在 SQL 查询中实现它)
但我个人会使用第一种方法。