首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

Android中获取SD卡下的图片资源

2021-09-30 来源:华拓网


当我想做一个相册的时候,我需要的获得SD卡下所有图片的路径path,然后利用Bitmap的方法画到到画布canvas上。 我该如何获得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如果是文件的话,就跳入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 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;iLog.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经过上述复杂的转换,终于可以得到了存有sdcared下所有图片的path的list了,可是其中这个list却是好巨大的,因为它连.thumbnails下的目录图片也得到了,其实起初我不知道这个文件是什么东西来的,在SDcare中看不到,后来一翻译就知道是缩略图。再翻阅一下网络,发现缩略图其实可以Cursor查到的,再想,缩略图和原图片应该是有关联的,果然,可以通过Thumbnails.IMAGE_ID,在Media.EXTERNAL_CONTENT_URI,中找到相对应的path,终于大费周章下来只不过是两个简单的方法的就可以获得SD卡下所有图片的path,不过我们获得的缩略图是整个SD卡图片的缩略图,该如何将他们按不同的文件夹分放呢?我还在研究。 先获得缩略图:

list = new ArrayList>(); 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 hash = new HashMap(); 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(); } }

因篇幅问题不能全部显示,请点此查看更多更全内容