繁体   English   中英

如何从手机上的所有图像获取图像路径

[英]How can I get image path from all images on phone

我想从手机上的所有图像获取路径。 我使用了这段代码,但是这给了我dcim / camera /目录中的每个文件(它包含我不想获取的video(.mp4)文件)。 我想获取每个目录中图像的路径。

String targetPath = ExternalStorageDirectoryPath + "/DCIM/Camera/";

File targetDirector = new File(targetPath);

final File[] files = targetDirector.listFiles();
for (File file : files){
    // file is path to file
}

为此,您将必须查询媒体商店内容提供程序。 在我的项目中,我使用以下方法获取与每个图像相关联的其他数据的列表。

public static ArrayList<MediaStorePhoto> getAllPhotosFromExternalStorage(ContentResolver mContentResolver) {

    MediaStorePhoto photo;
    ArrayList<MediaStorePhoto> photoList = new ArrayList<>();

    // which image properties are we querying
    String[] projection = new String[]{
            MediaStore.Images.Media.BUCKET_ID,
            MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
            MediaStore.Images.Media._ID,
            MediaStore.Images.Media.DATE_TAKEN,
            MediaStore.Images.Media.SIZE,
            MediaStore.Images.Media.DISPLAY_NAME,
            MediaStore.Images.Media.DATA
    };

    // content:// style URI for the "primary" external storage volume
    Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

    // Make the query.
    Cursor cur = mContentResolver.query(images,
            projection, // Which columns to return
            null,       // Which rows to return (all rows)
            null,       // Selection arguments (none)
            null        // Ordering
    );

    Log.i("ListingImages", " query count=" + cur.getCount());

    if (cur.moveToFirst()) {
        String bucketId;
        long id;
        long size;
        String bucket;
        String date;
        String name;
        String dataUri;

        int bucketIdColumn = cur.getColumnIndex(
                MediaStore.Images.Media.BUCKET_ID);

        int idColumn = cur.getColumnIndex(
                MediaStore.Images.Media._ID);

        int bucketColumn = cur.getColumnIndex(
                MediaStore.Images.Media.BUCKET_DISPLAY_NAME);

        int dateColumn = cur.getColumnIndex(
                MediaStore.Images.Media.DATE_TAKEN);

        int sizeColumn = cur.getColumnIndex(
                MediaStore.Images.Media.SIZE);

        int nameColumn = cur.getColumnIndex(
                MediaStore.Images.Media.DISPLAY_NAME);

        int dataColumn = cur.getColumnIndex(
                MediaStore.Images.Media.DATA);
        do {
            // Get the field values
            bucketId = cur.getString(bucketIdColumn);
            bucket = cur.getString(bucketColumn);
            date = cur.getString(dateColumn);
            size = cur.getLong(sizeColumn);
            id = cur.getLong(idColumn);
            name = cur.getString(nameColumn);
            dataUri = cur.getString(dataColumn);

            // Store photo in Photo object
            photo = new MediaStorePhoto(String.valueOf(id), name,
                    bucket, date, String.valueOf(size), "null", dataUri, bucketId);

            // Add photo to photo list
            photoList.add(photo);
        } while (cur.moveToNext());

    }
    cur.close();
    return photoList;
} 

注意:这里的MediaStorePhoto是我制作的类,

public class MediaStorePhoto implements Parcelable {

    public static final Creator CREATOR = new Creator() {
        public MediaStorePhoto createFromParcel(Parcel in) {
            return new MediaStorePhoto(in);
        }

        public MediaStorePhoto[] newArray(int size) {
            return new MediaStorePhoto[size];
        }
    };
    private String id;
    private String displayName;
    private String bucket;
    private String date;
    private String size;
    private String status;
    private String dataUri;
    private String bucketId;

    public MediaStorePhoto(String id, String displayName, String bucket, String date, String size, String status, String dataUri, String bucketId) {
        this.id = id;
        this.displayName = displayName;
        ...
        ...
        this.bucketId = bucketId;
    }

    public MediaStorePhoto(Parcel in) {
        String[] data = new String[8];

        in.readStringArray(data);
        this.id = data[0];
        this.displayName = data[1];
        ...
        ...
        this.bucketId = data[7];
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeStringArray(new String[]{this.id,
                this.displayName,
                this.bucket,
                ...
                ...
                this.bucketId});
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    ...
    ...
    ...

    public String getBucketId() {
        return bucketId;
    }

    public void setBucketId(String bucketId) {
        this.bucketId = bucketId;
    }
}

因此,图像的uri将在mediaStorePhoto.getDataUri()而且mediaStorePhoto.getBucket()将为您获取目录的名称。

好的,这是一个好的开始,但是您需要对其进行一些更改。 首先,为了遍历可变数量的文件路径,您需要一个在目录上调用自身的递归函数。

public void walk(File currDir, List<String> fileNames) {
    File[] list = null;
    try {
        list = currDir.listFiles();
    } catch (SecurityException e) {
        // Can't read this file, just do nothing.
        return;
    }
    File[] list = currDir.listFiles();
    for (File f : list) {
        if (f.isDirectory()) {
            walk(f, fileNames);
        } else {
            // Add only images with the extension "jpg" (substitute your own logic here if necessary)
            String fileName = f.getName();
            String extension = fileName.substring(fileName.lastIndexOf(".")+1);
            if ("jpg".equalsIgnoreCase(extension)) {
                fileNames.add(fileName);
            }
        }
    }
}

完成此操作后,您所需要做的就是在当前目录中调用它以启动链。 但是请注意,这可能需要一些时间,因此,如果您希望获得大量图像,则需要在与UI分开的线程中运行它。

List<String> files = new LinkedList<String>();
String targetPath = ExternalStorageDirectoryPath + "/DCIM/Camera/"; // TODO Change me as needed!
File targetDirectory = new File(targetPath);
walk(targetDirectory, files);

此后, files应在给定目录和所有子目录中具有所有JPG文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM