分享实现Android图片选择的两种方式
Android选择图片的两种方式:
第一种:单张选取
通过隐式启动activity,跳转到相册选择一张返回结果
关键代码如下:
发送请求:
privatestaticfinalintPICTURE=10086;//requestcode
Intentintent=newIntent();
if(Build.VERSION.SDK_INT<19){//因为AndroidSDK在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
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
if(data==null){
this.finish();
return;
}
Uriuri=data.getData();
switch(requestCode){
casePICTURE:
image=FileUtils.getUriPath(this,uri);//(因为4.4以后图片uri发生了变化)通过文件工具类对uri进行解析得到图片路径
break;
default:
break;
}
this.finish();
}
文件工具类:
publicclassFileUtils{
privatestaticfinalStringTAG="FileUtils";
privatestaticfinalbooleanDEBUG=false;
/**
*获取可读的文件大小
*/
publicstaticStringgetReadableFileSize(intsize){
finalintBYTES_IN_KILOBYTES=1024;
finalDecimalFormatdec=newDecimalFormat("###.#");
finalStringKILOBYTES="KB";
finalStringMEGABYTES="MB";
finalStringGIGABYTES="GB";
floatfileSize=0;
Stringsuffix=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;
}
}
}
returnString.valueOf(dec.format(fileSize)+suffix);
}
/**
*获取文件的文件名(不包括扩展名)
*/
publicstaticStringgetFileNameWithoutExtension(Stringpath){
if(path==null){
returnnull;
}
intseparatorIndex=path.lastIndexOf(File.separator);
if(separatorIndex<0){
separatorIndex=0;
}
intdotIndex=path.lastIndexOf(".");
if(dotIndex<0){
dotIndex=path.length();
}elseif(dotIndex<separatorIndex){
dotIndex=path.length();
}
returnpath.substring(separatorIndex+1,dotIndex);
}
/**
*获取文件名
*/
publicstaticStringgetFileName(Stringpath){
if(path==null){
returnnull;
}
intseparatorIndex=path.lastIndexOf(File.separator);
return(separatorIndex<0)?path:path.substring(separatorIndex+1,path.length());
}
/**
*获取扩展名
*/
publicstaticStringgetExtension(Stringpath){
if(path==null){
returnnull;
}
intdot=path.lastIndexOf(".");
if(dot>=0){
returnpath.substring(dot);
}else{
return"";
}
}
publicstaticFilegetUriFile(Contextcontext,Uriuri){
Stringpath=getUriPath(context,uri);
if(path==null){
returnnull;
}
returnnewFile(path);
}
publicstaticStringgetUriPath(Contextcontext,Uriuri){
if(uri==null){
returnnull;
}
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT&&DocumentsContract.isDocumentUri(context,uri)){
if("com.android.externalstorage.documents".equals(uri.getAuthority())){
finalStringdocId=DocumentsContract.getDocumentId(uri);
finalString[]split=docId.split(":");
finalStringtype=split[0];
if("primary".equalsIgnoreCase(type)){
returnEnvironment.getExternalStorageDirectory()+"/"+split[1];
}
}elseif("com.android.providers.downloads.documents".equals(uri.getAuthority())){
finalStringid=DocumentsContract.getDocumentId(uri);
finalUricontentUri=ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(id));
returngetDataColumn(context,contentUri,null,null);
}elseif("com.android.providers.media.documents".equals(uri.getAuthority())){
finalStringdocId=DocumentsContract.getDocumentId(uri);
finalString[]split=docId.split(":");
finalStringtype=split[0];
UricontentUri=null;
if("image".equals(type)){
contentUri=MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
}elseif("video".equals(type)){
contentUri=MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
}elseif("audio".equals(type)){
contentUri=MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
finalStringselection="_id=?";
finalString[]selectionArgs=newString[]{split[1]};
returngetDataColumn(context,contentUri,selection,selectionArgs);
}
}elseif("content".equalsIgnoreCase(uri.getScheme())){
if("com.google.android.apps.photos.content".equals(uri.getAuthority())){
returnuri.getLastPathSegment();
}
returngetDataColumn(context,uri,null,null);
}elseif("file".equalsIgnoreCase(uri.getScheme())){
returnuri.getPath();
}
returnnull;
}
publicstaticStringgetDataColumn(Contextcontext,Uriuri,Stringselection,String[]selectionArgs){
Cursorcursor=null;
finalStringcolumn="_data";
finalString[]projection={column};
try{
cursor=context.getContentResolver().query(uri,projection,selection,selectionArgs,null);
if(cursor!=null&&cursor.moveToFirst()){
finalintcolumn_index=cursor.getColumnIndexOrThrow(column);
returncursor.getString(column_index);
}
}finally{
if(cursor!=null)cursor.close();
}
returnnull;
}
}
第二种方式批量选择图片
如果我们需要类似于微信那样的一次选取多张图片,很明显第一种方式是不能满足需求,那么怎么才能批量选取呢?andorid并提供像单张选取似的批量选取的直接方法,所以我们只能自己从数据库中获得。
首先我们要认识一个类mediastore android中所有的多媒体文件都存储在这个数据库中,例如图片视频音频等等,他通过contentprovider向其他进程提供数据的接口
想要从mediastore中获得数据,我们可以使用与ContentProvider对应的ContentResolver
关键代码:
finalString[]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中取出即可