【Tech-Android-Other】Android中获取SD卡下的图片资源

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

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

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

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

                

<pre name="code" class="html">private String isSdcard(){
      File sdcardDir=null;
      boolean isSDExist=Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
      if(isSDExist){
        //如果存在SDcard就找到跟目录  
          sdcardDir=Environment.getExternalStorageDirectory();
          return sdcardDir.toString();
      }else {
        return null;
      }
       }        
   }


 


<span style="color:#333333;"> </span>

找到/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();
      }
  }


评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值