当我想做一个相册的时候,我需要的获得SD卡下所有图片的路径path,然后利用Bitmap的方法画到到画布canvas上。

我该如何获得SD卡下的图片路径呢?

其实在没有做好研究的之前我走了好多弯路,并且还是一个错误的弯路。

首先我先获得SD卡下的根目录路径:

privateString isSdcard(){
     File sdcardDir=null;
     boolean isSDExist=Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
     if(isSDExist){
       //如果存在SDcard 就找到跟目录   sdcardDir=Environment.getExternalStorageDirectory(); return sdcardDir.toString();
     }else {
       return null;

    

       

 

找到/sdcard之后,就开始利用File[] f = file.listFile();的方法获得目录下的所有文件的列表。

public void getpicpath(String sdpath){
     //打开SD卡目录
     File file = new File(sdpath);
     //获取SD卡目录列表
       File[] files =file.listFiles();
       for(int z=0;zlength;z++){
         File f = files[z];
         if(f.isFile()){
           isfile(f);         
        }else {
           notfile(f);        
        }
      
 }

如果是文件的话,就跳入isfile(File file);的方法中,如果是文件夹的话就跳入notfile(File file);方法中。

public void isfile(File file){
     Log.i(TAG, "isfile");
    
     Log.i(TAG, "isfile=="+fnm);
    
     mapsd=new HashMap();
         
       int idx = filename.lastIndexOf(".");

       if (idx <= 0) {
           return;
      
      
       if (suffix.toLowerCase().equals("jpg") ||
               suffix.toLowerCase().equals("jpeg") ||
               suffix.toLowerCase().equals("bmp") ||
               suffix.toLowerCase().equals("png") ||
            suffix.toLowerCase().equals(".gif") ){        mapsd.put("imagepath",file.getPath().toString());
            listsd.add(mapsd);

 

如果是有文件isfile 就配合他文件名的后缀名是否为图片,是的话放进mapsd中,再加到list中。

如果有文件是文件夹的话,就继续用file.listFile()打开它的文件夹里面的内容,再用for语句判断它里面的文件是否有文件,如果有就isfile();无,就利用getpicpath()打开它。

public void notfile(File file){
     Log.i(TAG, "notfile Yes");
     Log.i(TAG, "notfilepath"+file.getPath());
      File[] files = file.listFiles();
       if(files == null){
         return;
      
       for(int i = 0;ilength;i++){
          Log.i(TAG, "notfile int="+String.valueOf(files.length));          
        File fis=files[i];
         if(fis.isFile()){
           isfile(fis);
        }else{
        String SDpath=fis.getPath();
          File fileSD=new File(SDpath);
          Log.i(TAG, "notfile ="+fileSD);    
         
          if(filess == null){
             return;
         
          for(int j=0;jlength;j++){
             getpicpath(fileSD.toString());
         
         }

      

  


经过上述复杂的转换,终于可以得到了存有sdcared下所有图片的path的list了,可是其中这个list却是好巨大的,因为它连.thumbnails下的目录图片也得到了,其实起初我不知道这个文件是什么东西来的,在SDcare中看不到,后来一翻译就知道是缩略图。再翻阅一下网络,发现缩略图其实可以Cursor查到的,再想,缩略图和原图片应该是有关联的,果然,可以通过Thumbnails.IMAGE_ID,在Media.EXTERNAL_CONTENT_URI,中找到相对应的path,终于大费周章下来只不过是两个简单的方法的就可以获得SD卡下所有图片的path,不过我们获得的缩略图是整个SD卡图片的缩略图,该如何将他们按不同的文件夹分放呢?我还在研究。

先获得缩略图:

list = new ArrayList>();
     cr = getContentResolver();
     String[] projection = { Thumbnails._ID, Thumbnails.IMAGE_ID,
          Thumbnails.DATA };
     Cursor cursor = cr.query(Thumbnails.EXTERNAL_CONTENT_URI, projection,
         null, null, null);
 if(cur.moveToFirst())
    
       int _id;
       int image_id;
      
       int _idColumn = cur.getColumnIndex(Thumbnails._ID);
       int image_idColumn =cur.getColumnIndex(Thumbnails.IMAGE_ID);
       int dataColumn = cur.getColumnIndex(Thumbnails.DATA);
           Log.i(TAG, String.valueOf(image_idColumn)) 
       do
      
          // Get the field values
         
         
         

          // Do something with the values.
          // Log.i(TAG, _id + " image_id:"+ image_id + " path:"
          // + image_path +"---");
          HashMap hash = new HashMap();
          hash.put("image_id", image_id + "");
          hash.put("path", image_path);
          list.add(hash);

      
       while (cur.moveToNext());
 }

上述方法获得含有image_path和id的list

这里的image_path其实是缩略图的路径,要找到原图片的路径要利用image_id和原路径相关联的关系寻找,如下:

我是用SimpleAdapter显示图片的,所以点击的时候会得到一个position的位置int ,再找到image_id;