首页 > 代码库 > Android 获取SD卡的图片资源

Android 获取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;z<files.length;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");      String fnm=file.getPath();      Log.i(TAG, "isfile=="+fnm);           mapsd=new HashMap<String, String>();           String filename=file.getName();        int idx = filename.lastIndexOf(".");         if (idx <= 0) {            return;        }        String suffix =filename.substring(idx+1, filename.length());        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;i<files.length;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);               File[] filess=fileSD.listFiles();           if(filess == null){              return;           }           for(int j=0;j<filess.length;j++){              getpicpath(fileSD.toString());           }          }        }    }

 

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

先获得缩略图:

 list = new ArrayList<HashMap<String,String>>();      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;        String image_path;        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           _id = cur.getInt(_idColumn);           image_id =cur.getInt(image_idColumn);           image_path =cur.getString(dataColumn);            // Do something with the values.           // Log.i(TAG, _id + " image_id:"+ image_id + " path:"           // + image_path +"---");           HashMap<String, String> hash = new HashMap<String, String>();           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;public void onItemClick(AdapterView<?> arg0, Viewarg1, int position,        long arg3)   {cr = getContentResolver();      String image_id = list.get(position).get("image_id");        String[] projection = { Media._ID, Media.DATA };      Cursor cursor = cr.query(Media.EXTERNAL_CONTENT_URI, projection,           Media._ID + "=" + image_id, null, null);      if (cursor != null)      {        cursor.moveToFirst();        Stringpath = cursor.getString(cursor.getColumnIndex(Media.DATA));Log.i(TAG,path);}else    {        Toast.makeText(this, "Image doesn‘t exist!", Toast.LENGTH_SHORT)              .show();      }  }

Android 获取SD卡的图片资源