分享实现Android图片选择的两种方式
程序员文章站
2023-12-20 23:11:46
android选择图片的两种方式:
第一种:单张选取
通过隐式启动activity,跳转到相册选择一张返回结果
关键代码如下:
发送请求:
private...
android选择图片的两种方式:
第一种:单张选取
通过隐式启动activity,跳转到相册选择一张返回结果
关键代码如下:
发送请求:
private static final int picture = 10086; //requestcode intent intent = new intent(); if (build.version.sdk_int < 19) {//因为android sdk在4.4版本后图片action变化了 所以在这里先判断一下 intent.setaction(intent.action_get_content); } else { intent.setaction(intent.action_open_document); } intent.settype("image/*"); intent.addcategory(intent.category_openable); startactivityforresult(intent, picture);
接收结果:
@override protected void onactivityresult(int requestcode, int resultcode, intent data) { if (data == null) { this.finish(); return; } uri uri = data.getdata(); switch (requestcode) { case picture: image = fileutils.geturipath(this, uri); //(因为4.4以后图片uri发生了变化)通过文件工具类 对uri进行解析得到图片路径 break; default: break; } this.finish(); }
文件工具类:
public class fileutils { private static final string tag = "fileutils"; private static final boolean debug = false; /** * 获取可读的文件大小 */ public static string getreadablefilesize(int size) { final int bytes_in_kilobytes = 1024; final decimalformat dec = new decimalformat("###.#"); final string kilobytes = " kb"; final string megabytes = " mb"; final string gigabytes = " gb"; float filesize = 0; string suffix = kilobytes; if(size > bytes_in_kilobytes) { filesize = size / bytes_in_kilobytes; if(filesize > bytes_in_kilobytes) { filesize = filesize / bytes_in_kilobytes; if(filesize > bytes_in_kilobytes) { filesize = filesize / bytes_in_kilobytes; suffix = gigabytes; } else { suffix = megabytes; } } } return string.valueof(dec.format(filesize) + suffix); } /** * 获取文件的文件名(不包括扩展名) */ public static string getfilenamewithoutextension(string path) { if(path == null) { return null; } int separatorindex = path.lastindexof(file.separator); if(separatorindex < 0) { separatorindex = 0; } int dotindex = path.lastindexof("."); if(dotindex < 0) { dotindex = path.length(); } else if(dotindex < separatorindex) { dotindex = path.length(); } return path.substring(separatorindex + 1, dotindex); } /** * 获取文件名 */ public static string getfilename(string path) { if(path == null) { return null; } int separatorindex = path.lastindexof(file.separator); return (separatorindex < 0) ? path : path.substring(separatorindex + 1, path.length()); } /** * 获取扩展名 */ public static string getextension(string path) { if(path == null) { return null; } int dot = path.lastindexof("."); if(dot >= 0) { return path.substring(dot); } else { return ""; } } public static file geturifile(context context, uri uri) { string path = geturipath(context, uri); if(path == null) { return null; } return new file(path); } public static string geturipath(context context, uri uri) { if(uri == null) { return null; } if(build.version.sdk_int >= build.version_codes.kitkat && documentscontract.isdocumenturi(context, uri)) { if("com.android.externalstorage.documents".equals(uri.getauthority())) { final string docid = documentscontract.getdocumentid(uri); final string[] split = docid.split(":"); final string type = split[0]; if("primary".equalsignorecase(type)) { return environment.getexternalstoragedirectory() + "/" + split[1]; } } else if("com.android.providers.downloads.documents".equals(uri.getauthority())) { final string id = documentscontract.getdocumentid(uri); final uri contenturi = contenturis.withappendedid(uri.parse("content://downloads/public_downloads"), long.valueof(id)); return getdatacolumn(context, contenturi, null, null); } else if("com.android.providers.media.documents".equals(uri.getauthority())) { final string docid = documentscontract.getdocumentid(uri); final string[] split = docid.split(":"); final string type = split[0]; uri contenturi = null; if("image".equals(type)) { contenturi = mediastore.images.media.external_content_uri; } else if("video".equals(type)) { contenturi = mediastore.video.media.external_content_uri; } else if("audio".equals(type)) { contenturi = mediastore.audio.media.external_content_uri; } final string selection = "_id=?"; final string[] selectionargs = new string[] {split[1]}; return getdatacolumn(context, contenturi, selection, selectionargs); } } else if("content".equalsignorecase(uri.getscheme())) { if("com.google.android.apps.photos.content".equals(uri.getauthority())) { return uri.getlastpathsegment(); } return getdatacolumn(context, uri, null, null); } else if("file".equalsignorecase(uri.getscheme())) { return uri.getpath(); } return null; } public static string getdatacolumn(context context, uri uri, string selection, string[] selectionargs) { cursor cursor = null; final string column = "_data"; final string[] projection = {column}; try { cursor = context.getcontentresolver().query(uri, projection, selection, selectionargs, null); if(cursor != null && cursor.movetofirst()) { final int column_index = cursor.getcolumnindexorthrow(column); return cursor.getstring(column_index); } } finally { if(cursor != null) cursor.close(); } return null; } }
第二种方式 批量选择图片
如果我们需要类似于微信那样的一次选取多张图片,很明显第一种方式是不能满足需求,那么怎么才能批量选取呢?andorid并提供像单张选取似的批量选取的直接方法,所以我们只能自己从数据库中获得。
首先我们要认识一个类mediastore android中所有的多媒体文件都存储在这个数据库中,例如图片 视频 音频 等等,他通过contentprovider 向其他进程提供数据的接口
想要从mediastore中获得数据,我们可以使用与contentprovider 对应的contentresolver
关键代码:
final string[] projectionphotos = { mediastore.images.media._id,//每一列的id 图片的id mediastore.images.media.bucket_id,//图片所在文件夹id mediastore.images.media.bucket_display_name,//图片所在文件夹名称 mediastore.images.media.data,//图片路径 mediastore.images.media.date_taken,//图片创建时间 }; cursor = mediastore.images.media.query(context.getcontentresolver(), mediastore.images.media.external_content_uri , projectionphotos, "", null, mediastore.images.media.date_taken + " desc");
所有图片都在cursor里了 再从cursor中取出即可