先说用法

1、开始选图(相机、相册)

//这句代码启动相机拍照SelectPicUtil.getByCamera(this);//这句代码跳转到相册选图SelectPicUtil.getByAlbum(this);

2、处理图片,在onActivityResult中处理

protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){//输出图片800*400大小,选择图片时的裁剪比例是2:1bm=SelectPicUtil.onActivityResult(this,requestCode,resultCode,data,800,400,2,1);if(bm!=null){...}}

OK,用法就这么简单!目前我测试的所有机型都没问题(当然不是所有机型),图片也不用去考虑大小,反正都是存SD卡,不会内存溢出的。不过注意需要读写SD卡的权限(一般项目肯定是会有的)。

接下来就是代码啦

←。←copy的时候留个author可以么,毕竟人家写的这么辛苦。

importjava.io.FileNotFoundException;importandroid.app.Activity;importandroid.content.Context;importandroid.content.Intent;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;importandroid.net.Uri;importandroid.os.Environment;importandroid.provider.MediaStore;/***选择本地图片工具类*<br>*因为直接获取图片容易崩溃,所以直接存入SD卡,再获取*<br>*又因为写法不正确容易导致部分机型无法使用,所以封装起来复用*<br>*使用方法:*<br>*1、调用getByAlbum、getByCamera去获取图片*<br>*2、在onActivityResult中调用本工具类的onActivityResult方法进行处理*<br>*3、onActivityResult返回的Bitmap记得空指针判断**<br><br>*PS:本工具类只能处理裁剪图片,如果不想裁剪,不使用本工具类的onActivityResult,自己做处理即可**@authorlinin630**/publicclassSelectPicUtil{/**临时存放图片的地址,如需修改,请记得创建该路径下的文件夹*/privatestaticfinalStringlsimg="file:///sdcard/temp.jpg";publicstaticfinalintGET_BY_ALBUM=801;//如果有冲突,记得修改publicstaticfinalintGET_BY_CAMERA=802;//如果有冲突,记得修改publicstaticfinalintCROP=803;//如果有冲突,记得修改/**从相册获取图片*/publicstaticvoidgetByAlbum(Activityact){IntentgetAlbum=newIntent(Intent.ACTION_GET_CONTENT);getAlbum.setType("image/*");act.startActivityForResult(getAlbum,GET_BY_ALBUM);}/**通过拍照获取图片*/publicstaticvoidgetByCamera(Activityact){Stringstate=Environment.getExternalStorageState();if(state.equals(Environment.MEDIA_MOUNTED)){IntentgetImageByCamera=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT,Uri.parse(lsimg));getImageByCamera.putExtra(MediaStore.EXTRA_VIDEO_QUALITY,0);act.startActivityForResult(getImageByCamera,GET_BY_CAMERA);}else{L.e("请确认已经插入SD卡");}}/***处理获取的图片,注意判断空指针,默认大小480*480,比例1:1*/publicstaticBitmaponActivityResult(Activityact,intrequestCode,intresultCode,Intentdata){returnonActivityResult(act,requestCode,resultCode,data,0,0,0,0);}/***处理获取的图片,注意判断空指针*/publicstaticBitmaponActivityResult(Activityact,intrequestCode,intresultCode,Intentdata,intw,inth,intaspectX,intaspectY){Bitmapbm=null;if(resultCode==Activity.RESULT_OK){Uriuri=null;switch(requestCode){caseGET_BY_ALBUM:uri=data.getData();uri=dealUri(act,uri);//适配4.4系统act.startActivityForResult(crop(uri,w,h,aspectX,aspectY),CROP);break;caseGET_BY_CAMERA:uri=Uri.parse(lsimg);act.startActivityForResult(crop(uri,w,h,aspectX,aspectY),CROP);break;caseCROP:bm=dealCrop(act);break;}}returnbm;}/**默认裁剪输出480*480,比例1:1*/publicstaticIntentcrop(Uriuri){returncrop(uri,480,480,1,1);}/***裁剪,例如:输出100*100大小的图片,宽高比例是1:1*@paramw输出宽*@paramh输出高*@paramaspectX宽比例*@paramaspectY高比例*/publicstaticIntentcrop(Uriuri,intw,inth,intaspectX,intaspectY){if(w==0&&h==0){w=h=480;}if(aspectX==0&&aspectY==0){aspectX=aspectY=1;}Intentintent=newIntent("com.android.camera.action.CROP");//照片URL地址intent.setDataAndType(uri,"image/*");intent.putExtra("crop","true");intent.putExtra("aspectX",aspectX);intent.putExtra("aspectY",aspectY);intent.putExtra("outputX",w);intent.putExtra("outputY",h);//输出路径intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.parse(lsimg));//输出格式intent.putExtra("outputFormat","JPEG");//不启用人脸识别intent.putExtra("noFaceDetection",true);intent.putExtra("return-data",false);returnintent;}/**处理裁剪,获取裁剪后的图片*/publicstaticBitmapdealCrop(Contextcontext){//裁剪返回Uriuri=Uri.parse(lsimg);Bitmapbitmap=null;try{bitmap=BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri));}catch(FileNotFoundExceptione){e.printStackTrace();}returnbitmap;}/**适配4.4系统*/publicstaticUridealUri(Activityact,Uriuri){StringfilePath=null;if(DocumentsContract.isDocumentUri(act,uri)){StringwholeID=DocumentsContract.getDocumentId(uri);Stringid=wholeID.split(":")[1];String[]column={MediaStore.Images.Media.DATA};Stringsel=MediaStore.Images.Media._ID+"=?";Cursorcursor=act.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,column,sel,newString[]{id},null);intcolumnIndex=cursor.getColumnIndex(column[0]);if(cursor.moveToFirst()){filePath=cursor.getString(columnIndex);}cursor.close();}else{String[]projection={MediaStore.Images.Media.DATA};Cursorcursor=act.getContentResolver().query(uri,projection,null,null,null);intcolumn_index=cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);cursor.moveToFirst();filePath=cursor.getString(column_index);}uri=Uri.fromFile(newFile(filePath));returnuri;}}

如果的话

如果用我的工具类出问题了,麻烦在这里提一下,我会继续完善的~~或者有什么高见也说一下哦~~

------------------

加入适配4.4系统代码,关键代码在dealUri方法中。

参考:http://blog.sina.com.cn/s/blog_5da93c8f0101qujc.html

更多相关文章

  1. android中 关于listitem 获得焦点时,改变其背景
  2. android学习笔记4:图片显示imageVIew
  3. 实现如何Android(安卓)获得图片的总结
  4. Android(安卓)公用XML解析
  5. Android滑动列表加载大量图片时候的优化
  6. android --- Afianl框架里面的FinalBitmap加载网络图片
  7. [Android算法] bitmap 将图片压缩到指定的大小
  8. Android(安卓)MonkeyRunner 功能测试 自动执行 挂机脚本
  9. android 获取视频缩略图终极解决方案(ffmpeg)

随机推荐

  1. Android(安卓)Nine Patch图片及按钮背景
  2. Android中关于Volley的使用(一)加载图片
  3. Android(安卓)图片特效如何实现及总结
  4. 记录一下我的Android学习过程-第一课
  5. Android(安卓)P 开发者预览版 · 操作指
  6. Android(安卓)真的能跨平台吗?(翻译)
  7. android Java开发设计模式及在android中
  8. 腾讯优测优分享 | Android性能测试工具化
  9. 将程序安装到SD卡
  10. Android单元测试——初探