首先我先获得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. 【Alpha】Phylab 展示博客

    目录 Phylab Alpha 展示博客 一.团队简介 二.项目目标 2.1 典型用户 2.2 功能描述 2.3 用户量 三.项目发布与展示 3.1 新功能 3.2 修复缺陷 3.3 问题与限制 3. ...

  2. Vue项目开发目录结构

    最近做一些CI+Vue开发的简单项目,由于刚开始一直从事后端,对Vue了解不是很多,fork了团队的项目代码发现项目的文件夹很多,一时间有些懵,上网上参考了部分资料,博客园中的放晴的天空与狮子爱吃草两 ...

  3. 通过js获取内网ip和外网ip的简单方法 ...

    今天遇到了一个需求,需要获取用户当前的内网ip, 找了半天终于找到了方法,遂将找到的方法记录下来,留给需要的人. 1,获取内网ip function getIP(callback) { let rec ...

  4. PHP常见缓存机制

    PHP常用的几种缓存机制_PHP教程 普遍缓存技术 数据缓存:这里所说的数据缓存是指数据库查询PHP缓存机制,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不存在,就连接数据库,得到数据, ...

  5. C# this关键字(给底层类库扩展成员方法)

    本文参考自唔愛吃蘋果的C#原始类型扩展方法—this参数修饰符,并在其基础上做了一些细节上的解释 1.this作为参数关键字的作用 使用this关键字,可以向this关键字后面的类型添加扩展方法,而无 ...

  6. SVN linux 服务器端配置

    一. SVN 简单介绍 Subversion(SVN) 是一个开源的版本号控制系統, 也就是说 Subversion 管理着随时间改变的数据. 这些数据放置在一个中央资料档案库 (repository ...

  7. 【Guava】PreConditions来校验参数

    前置条件:让方法调用的前置条件判断更简单. 在我们的日常开发中,经常要对入参进行一定的参数校验,比如是否为空,参数的取值范围是否符合要求等等.这种参数校验如果我们单独进行校验的话,代码的重复率比较高, ...

  8. Apache无法启动报错查看

    wampserver橙色图标 查找原因 1.测试80端口 . 如已被占用,则改别的端口在启动apache.怎么改apache的的端口去百度一下都有. 2.找到httpd.exe的目录.在cmd命令行下 ...

  9. Ambari集群里操作时典型权限问题put: `/home/bigdata/1.txt': No such file or directory的解决方案(图文详解)

    不多说,直接上干货! 问题详情 明明put该有的文件在,可是怎么提示的是文件找不到的错误呢? 我就纳闷了put: `/home/bigdata/1.txt': No such file or dire ...

  10. 2018最新win10 安装tensorflow1.4(GPU/CPU)+cuda8.0+cudnn8.0-v6 + keras 安装CUDA失败 导入tensorflow失败报错问题解决

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9747019.html 基本开发环境搭建 1. Microsoft Windows 版本 关于W ...