2015-09-28 37 views
0

我想从手机上的所有图像获取路径。我使用了这段代码,但是这给了我在dcim/camera /目录下的所有文件(它包含了我不想得到的视频(.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 
} 
+0

如果你想使用'File'和'listFiles',你必须做一个递归的入口到每个目录中,用适当的扩展名(或元数据)嗅探文件,因为它只给你当前的条目目录。像[这个答案](http://stackoverflow.com/a/11482350/410342)会有所帮助,但你必须确保你在自己的线程中运行它。 –

回答

-1

好的,你有什么是一个好的开始,但你需要改变一点点。首先,为了通过可能数量可变的文件路径,你需要一个递归函数来调用它自己的目录。

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文件给定目录和所有子目录。

+0

我试过的代码,它发现所有的.jpg图片,但只在定义的目录(/ DCIM/Camera /),当你只放/ DCIM /它找到该目录中的.jpg文件,但我希望它在每个目录(dcim,图像,图片或任何其他目录)。我试图删除/ dcim/camera /并保留ExternalStorageDirectoryPath,但它使应用程序崩溃。 –

+0

是的,首先,*课程*它只检查DCIM /相机;这是指定的根路径,它不会从那里倒退。其次,你需要对'listFiles()'进行异常处理,因为你需要处理由该方法抛出的SecurityException。 –

+0

我会编辑我的答案。 –

1

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

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()将让你的目录名。