Android 如何加载存储在特定文件夹(或带有ID)中的图片的缩略图?

Android 如何加载存储在特定文件夹(或带有ID)中的图片的缩略图?,android,mediastore,Android,Mediastore,我有一个带有GridView的活动,我想在其中显示使用标准照相机活动拍摄并存储在特定文件夹中的图像的缩略图。此活动实现LoaderManager.LoaderCallbacks接口,下面是其onCreateLoader()方法的代码 ... ... private static final String APP_PICTURES_DIRECTORY_NAME = "Pictures to process"; private String[] mProjection = { Me

我有一个带有GridView的活动,我想在其中显示使用标准照相机活动拍摄并存储在特定文件夹中的图像的缩略图。此活动实现LoaderManager.LoaderCallbacks接口,下面是其onCreateLoader()方法的代码

...
...

private static final String APP_PICTURES_DIRECTORY_NAME = "Pictures to process";
private String[] mProjection = {
        MediaStore.Images.Thumbnails._ID,
        MediaStore.Images.Thumbnails.DATA,
        MediaStore.Images.Thumbnails.IMAGE_ID
};

private SimpleCursorAdapter mCursorAdapter;

...
...
...

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String[] imagesProjection = {"_id", "_data"};
    Cursor imagesCursor;

    imagesCursor = getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            imagesProjection,
            MediaStore.Images.Media.DATA + " LIKE '%" + APP_PICTURES_DIRECTORY_NAME + "%'",
            null,
            null
    );

    String[] imageIds = new String[imagesCursor.getCount()];
    int i = 0;
    while (imagesCursor.moveToNext()) {
        imageIds[i++] = imagesCursor.getString(imagesCursor.getColumnIndex(MediaStore.Images.Media._ID));
    }

    String[] selectionArgs = {TextUtils.join(",", imageIds)};
    return new CursorLoader(
        JourneyAlbumActivity.this,
        MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
        mProjection,
        MediaStore.Images.Thumbnails.KIND + " = " + MediaStore.Images.Thumbnails.MINI_KIND +
                " AND " + MediaStore.Images.Thumbnails.IMAGE_ID + " IN (?)",
        selectionArgs,
        MediaStore.Images.Thumbnails.IMAGE_ID + " DESC"
    );
}

一切都很好,但结果是,我有一个网格的缩略图,所有的图像拍摄与相机,而我只需要那些从我的特定目录。如何为来自特定文件夹或具有特定ID的图像选择缩略图?

也许您可以尝试以下方法:

System.out.println("getFilePaths()");
        File fileDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ File.separator +"folder_name"+ File.separator + AppConstant.PHOTO_ALBUM);
        if(!fileDir.exists()){
            System.out.println("fileDir does not exist");
            try{
                fileDir.mkdir();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        else
            System.out.println("fileDir DOES exist");
        File directory = fileDir;

        // check for directory
        if (directory.isDirectory()) {
            // getting list of file paths
            File[] listFiles = directory.listFiles();

            // Check for count
            if (listFiles.length > 0) {

                // loop through all files
                for (int i = 0; i < listFiles.length; i++) {

                    // get file path
                    String filePath = listFiles[i].getAbsolutePath();

                    // check for supported file extension
                    if (IsSupportedFile(filePath)) {
                        // Add image path to array list
                        filePaths.add(filePath);
                    }
                }
            } else {
                // image directory is empty
                Toast.makeText(
                        _context,
                        AppConstant.PHOTO_ALBUM
                                + " is empty. Please load some images in it !",
                        Toast.LENGTH_LONG).show();
            }

        } else {
            AlertDialog.Builder alert = new AlertDialog.Builder(_context);
            alert.setTitle("Error!");
            alert.setMessage(AppConstant.PHOTO_ALBUM
                    + " directory path is not valid! Please set the image directory name AppConstant.java class");
            alert.setPositiveButton("OK", null);
            alert.show();
        }
System.out.println(“getFilePath()”);
File fileDir=新文件(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+“folder\u name”+File.separator+AppConstant.PHOTO\u相册);
如果(!fileDir.exists()){
System.out.println(“fileDir不存在”);
试一试{
fileDir.mkdir();
}捕获(例外e){
e、 printStackTrace();
}
}
其他的
System.out.println(“fileDir确实存在”);
File directory=fileDir;
//检查目录
if(directory.isDirectory()){
//获取文件路径列表
File[]listFiles=directory.listFiles();
//清点
如果(listFiles.length>0){
//循环浏览所有文件
对于(int i=0;i
实际上,要使其工作,必须将参数直接插入子句中:

return new CursorLoader(
    JourneyAlbumActivity.this,
    MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
    mProjection,
    MediaStore.Images.Thumbnails.KIND + " = " + MediaStore.Images.Thumbnails.MINI_KIND +
            " AND " + MediaStore.Images.Thumbnails.IMAGE_ID + " IN ("+TextUtils.join(",", ids)+")",
    selectionArgs,
    MediaStore.Images.Thumbnails.IMAGE_ID + " DESC"
);

向您问好,

嗯。。。加载程序在哪里,MediaStore查询在哪里,或者至少是类似于从内容提供商加载数据的内容?您建议如何检查底层内容是否已更新,加载程序是为哪些内容而设计的?我不认为这与我的问题有任何关系。我只是建议一种我过去曾成功使用的替代方法。我从来没有用过MediaStore,所以我不能帮你。对不起,真的谢谢你的努力。但这真的不是我需要的。我需要我的应用程序来反映数据的变化,比如当我用相机拍摄新照片时,它被保存到目录中,我回到网格活动新数据(刚刚拍摄的照片的缩略图)应该立即出现在那里,这是完全一样的工作已经只是对设备上的所有图像,而我只需要特定的照片被加载。
return new CursorLoader(
    JourneyAlbumActivity.this,
    MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
    mProjection,
    MediaStore.Images.Thumbnails.KIND + " = " + MediaStore.Images.Thumbnails.MINI_KIND +
            " AND " + MediaStore.Images.Thumbnails.IMAGE_ID + " IN ("+TextUtils.join(",", ids)+")",
    selectionArgs,
    MediaStore.Images.Thumbnails.IMAGE_ID + " DESC"
);