分享实现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中取出即可