zoukankan      html  css  js  c++  java
  • 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();
    
          }
    
      }
  • 相关阅读:
    线性时不变系统的频率选择滤波器
    Why Programmmers dont have a High Social Status?
    Oracle 的DBA考证
    基于matlab的FIR加窗滤波器设计
    奥本海姆《离散时间信号处理》第二版书评
    Altium Designer 发现的机密——摘自CRAZY BINGO
    sql server 2008 添加登录名
    Silverlight listbox横向排列
    IOS 摄像头使用(1)UIImagePickerController
    ios 如何获得系统时间和日期
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4206692.html
Copyright © 2011-2022 走看看