首先我先获得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=;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 <= ) {

            return;

        }

        String suffix =filename.substring(idx+, 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 = ;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=;j<filess.length;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<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卡的图片资源的更多相关文章

  1. Android 获取SD卡路径和推断SD卡是否存在

    android获取sd卡路径方法: 不建议直接写死android sd卡的路径. public String getSDPath(){ File sdDir = null; boolean sdCar ...

  2. android 获取sd卡根目录

    dir:/storage/emulated/0 也就是 sdcard目录 ====== android 获取sd卡根目录 public String getSDPath(){        File ...

  3. Android获取SD卡路径及SDCard内存的方法

    这篇文章主要介绍了Android获取SD卡路径及SDCard内存的方法,较为详细的分析了Android针对SD卡操作所涉及的类及其具体函数功能,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了A ...

  4. Android获取SD卡路径/内存的几种方法

    Android获取SD卡路径 本篇将会带领大家学习如何获取android路径的几种常见用法,但在我开始bb之前需要大家清楚android中内存和外存之间的区别,下面进行简短介绍:android中的内存 ...

  5. Android - 获取SD卡的内存空间大小

    获取SD卡的内存空间大小 //获得SD卡空间的信息 File path=Environment.getExternalStorageDirectory(); StatFs statFs=new Sta ...

  6. Android获取SD卡中选中图片的路径(URL)

    最近在做一个图片上传的功能,需要提供上传图片在SD卡中的路径,在网上看了些例子,改改调试成功,代码很简单.其布局文件如下: [html]  view plain copy   <?xml ver ...

  7. android获取sd卡路径方法

    public String getSDPath(){  File sdDir = null;  boolean sdCardExist = Environment.getExternalStorage ...

  8. Android获取SD卡总容量,可用大小,机身内存总容量及可用大小

    public long getSDTotalSize() { /*获取存储卡路径*/ File sdcardDir= Environment.getExternalStorageDirectory() ...

  9. android 获取SD卡的图片及其路径

    1.首先是intent的设置: private static final int IMAGECODE = 0; Intent imageIntent = new Intent(Intent.ACYIO ...

随机推荐

  1. PXE+Kickstart 批量安装CentOS 7

    安装之前 将需要安装 CentOS 的服务器与 PXE 服务器通过网络设备连接:PXE 服务器安装 CentOS,并且关闭firewalld.selinux,设置静态IP地址,本例设为10.0.0.1 ...

  2. 解压命令tar zxvf中zxvf的意思

    x : 从 tar 包中把文件提取出来 z : 表示 tar 包是被 gzip 压缩过的,所以解压时需要用 gunzip 解压 v : 显示详细信息 f xxx.tar.gz : 指定被处理的文件是 ...

  3. Powershell cannot be loaded because running scripts is disabled on this system 解决办法

    问题背景 第一次跑ps时,出现了下面的提示.这是因为windows不允许执行脚本而已,不要大惊小怪. 解决办法 这个需要管理员执行,不然会出现以下的情况 正常情况

  4. [转] 手动上传jar包到远程仓库 (maven deploy)

    [From] https://my.oschina.net/360yg/blog/1588899 前言:通常允许上传的远程仓库有两种:Snapshots和Releases,分别为快照版仓库和稳定版仓库 ...

  5. php7安装并apache

    1.下载php7 选择THREAD SAFE版本,如果是64位系统要下载x64的,x86的不行 2.解压到想要安装的目录 3.apache配置 1) 添加PHP模块 查找“Dynamic Shared ...

  6. [转]分布式锁-RedisLockRegistry源码分析

    前言 官网的英文介绍大概如下: Starting with version 4.0, the RedisLockRegistry is available. Certain components (f ...

  7. PHP加密解密数字,适用于URL加密。

    本博主最近正在建设一个9元包邮的网站,希望各位光临指导一些意见: 9元包邮 http://www.jiubaou.com/ <?php /** * 加密解密类 * 该算法仅支持加密数字.比较适用 ...

  8. the unchecked warnings

    5.1.9. Unchecked Conversion Let G name a generic type declaration with n type parameters. There is a ...

  9. SimpleCalendar日历插件改版

    先附上一张货真价实的效果图: 以上部分代码,为了适应我司项目的需求,原来插件源码大改(因为项目中下拉框用了select2,所以原来插件的下拉框就有问题了,在加上原来插件本身就有点问题,特别是农历 .节 ...

  10. angular环境搭建时的坑

    安装angular环境踩过一些坑,最终还是把工程跑起来了,这里描述一下我的步骤,不排除有些步骤是多余的,希望能对遇到同样问题的小伙伴有帮助. 下载最新版node.js. 安装node,安装过程一路点下 ...