[英]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.