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=;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卡的图片资源的更多相关文章
- Android 获取SD卡路径和推断SD卡是否存在
android获取sd卡路径方法: 不建议直接写死android sd卡的路径. public String getSDPath(){ File sdDir = null; boolean sdCar ...
- android 获取sd卡根目录
dir:/storage/emulated/0 也就是 sdcard目录 ====== android 获取sd卡根目录 public String getSDPath(){ File ...
- Android获取SD卡路径及SDCard内存的方法
这篇文章主要介绍了Android获取SD卡路径及SDCard内存的方法,较为详细的分析了Android针对SD卡操作所涉及的类及其具体函数功能,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了A ...
- Android获取SD卡路径/内存的几种方法
Android获取SD卡路径 本篇将会带领大家学习如何获取android路径的几种常见用法,但在我开始bb之前需要大家清楚android中内存和外存之间的区别,下面进行简短介绍:android中的内存 ...
- Android - 获取SD卡的内存空间大小
获取SD卡的内存空间大小 //获得SD卡空间的信息 File path=Environment.getExternalStorageDirectory(); StatFs statFs=new Sta ...
- Android获取SD卡中选中图片的路径(URL)
最近在做一个图片上传的功能,需要提供上传图片在SD卡中的路径,在网上看了些例子,改改调试成功,代码很简单.其布局文件如下: [html] view plain copy <?xml ver ...
- android获取sd卡路径方法
public String getSDPath(){ File sdDir = null; boolean sdCardExist = Environment.getExternalStorage ...
- Android获取SD卡总容量,可用大小,机身内存总容量及可用大小
public long getSDTotalSize() { /*获取存储卡路径*/ File sdcardDir= Environment.getExternalStorageDirectory() ...
- android 获取SD卡的图片及其路径
1.首先是intent的设置: private static final int IMAGECODE = 0; Intent imageIntent = new Intent(Intent.ACYIO ...
随机推荐
- python 全栈开发:数据类型整体分析
数据类型初始 数据类型: int :用于计算. 例子:1.2.3.4........................... 常用方法操作: bit_length() ps:求一个数字转换成二 ...
- net与树莓派的情缘-安装Redis(四)
在Linux下安装Redis非常简单,具体步骤如下(官网有说明): .下载源码,解压缩后编译源码. $ wget http://download.redis.io/releases/redis-3.0 ...
- 从setTimeout谈js运行机制
众所周知,JavaScript是单线程的编程,什么是单线程,就是说同一时间JavaScript只能执行一段代码,如果这段代码要执行很长时间,那么之后的代码只能尽情地等待它执行完才能有机会执行,不像人一 ...
- GitHub注册和Git安装
一.注册GitHub GitHub官方地址:https://github.com. 在浏览器中打开GitHub网址,通过首页进行注册,如下图所示. 二.安装Git Git官方下载地址:http://g ...
- 19.Class的基本语法
1.简介 JavaScript 语言中,生成实例对象的传统方法是通过构造函数. function Point(x, y) { this.x = x; this.y = y; } Point.proto ...
- maven的安装配置超详细教程【含nexus】
1 下载 下载地址:http://maven.apache.org/download.cgi 界面效果如下: 点击之后进入的apache 软件基金的发布目录,在这里你可以下载apache的所有项目. ...
- 微服务Kong(四)——添加插件
在本节中,您将学习到,如何配置使用KONG的插件来管理您的API.KONG的核心原则之一就是通过插件来实现API的扩展.插件可以使您更为简单的扩展和管理您的API. 在以下的步骤中,您将通过配置key ...
- PHP之string之chr()函数使用
chr (PHP 4, PHP 5, PHP 7) chr - Return a specific character chr - 返回指定的字符 Description string chr ( i ...
- 在spring中常被忽视的注解 @Primary
在spring 中使用注解,常使用@Autowired, 默认是根据类型Type来自动注入的. 但有些特殊情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况下 @Primary ...
- Mongo db 与mysql 语法比较
mongodb与mysql命令对比 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(col ...