zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

android照相、相册获取图片剪裁报错的解决方法

Android方法 报错 解决 获取 图片 相册 剪裁
2023-06-13 09:15:30 时间

这是调用相机 

publicstaticFilegetImageFromCamer(Contextcontext,FilecameraFile, intREQUE_CODE_CAMERA,Intentintent){ intent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE); FilefileDir=HelpUtil.getFile(context,"/Tour/user_photos"); cameraFile=newFile(fileDir.getAbsoluteFile()+"/" +System.currentTimeMillis()+".jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(cameraFile)); ((Activity)context).startActivityForResult(intent,REQUE_CODE_CAMERA); returncameraFile; }

在这里我返回了一个file对象,这是应为项目中需要,大家可以不必真写,直接传一个Uri对象过来就好了

 

下面是调用相册

 

publicstaticvoidgetImageFromPhoto(Contextcontext,intREQUE_CODE_PHOTO){ Intentintent=newIntent(Intent.ACTION_PICK,null); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); ((Activity)context).startActivityForResult(intent,REQUE_CODE_PHOTO); }

当然接下来是调用Activity的OnActivityResult了

 

 

@Override protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){ if(resultCode==RESULT_OK){ switch(requestCode){ caseConstantUtil.REQUE_CODE_CAMERA: uri=Uri.fromFile(cameraFile); PhotoUtil.startPhotoZoom(context,uri, ConstantUtil.REQUE_CODE_CROP); break; caseConstantUtil.REQUE_CODE_PHOTO: if(null!=data){//为了取消选取不报空指针用的 uri=data.getData(); PhotoUtil.startPhotoZoom(context,uri, ConstantUtil.REQUE_CODE_CROP); } break; caseConstantUtil.REQUE_CODE_CROP: if(uri==null){ break; } cropBitmap=HelpUtil.getBitmapFromUri(uri,context); if(cropBitmap!=null){ iv_headphoto.setImageBitmap(cropBitmap); baos=newByteArrayOutputStream(); cropBitmap.compress(Bitmap.CompressFormat.JPEG,100,baos); headPicString=newString(Base64.encode( baos.toByteArray(),0)); UploadPic(headPicString); } break; default: break; } }

当然还有大家关心的剪切

publicstaticvoidstartPhotoZoom(Contextcontext,Uriuri, intREQUE_CODE_CROP){ intdp=500; Intentintent=newIntent("com.android.camera.action.CROP"); intent.setDataAndType(uri,"image/*"); //下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪 intent.putExtra("crop","true"); intent.putExtra("scale",true);//去黑边 intent.putExtra("scaleUpIfNeeded",true);//去黑边 //aspectXaspectY是宽高的比例 intent.putExtra("aspectX",1);//输出是X方向的比例 intent.putExtra("aspectY",1); //outputXoutputY是裁剪图片宽高,切忌不要再改动下列数字,会卡死 intent.putExtra("outputX",dp);//输出X方向的像素 intent.putExtra("outputY",dp); intent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection",true); intent.putExtra(MediaStore.EXTRA_OUTPUT,uri); intent.putExtra("return-data",false);//设置为不返回数据 ((Activity)context).startActivityForResult(intent,REQUE_CODE_CROP); }

在很多博客中都把“return-data”设置为了true然后在onActivityResult中通过data.getParcelableExtra("data")来获取数据,不过这样的话dp这个变量的值就不能太大了,不然你的程序就挂了。这里也就是我遇到问题的地方了,在大多数高配手机上这样用是没有问题的,不过很多低配手机就有点hold不住了,直接就异常了,包括我们的国产神机米3也没能hold住,所以我建议大家不要通过returndata大数据,小数据还是没有问题的,说以我们在剪切图片的时候就尽量使用Uri这个东东来帮助我们。

下面是我们进行剪裁用到的一些参数

ExtaOptionsTableforimage/*crop:

 

SetExtra DataType Description crop String Signalsthecropfeature aspectX int AspectRatio aspectY int AspectRatio outputX int widthofoutputcreatedfromthisIntent outputY int widthofoutputcreatedfromthisIntent scale boolean shoulditscale return-data boolean ReturnthebitmapwithAction=inline-databyusingthedata data Parcelable Bitmaptoprocess,youmayprovideitabitmap(nottested) circleCrop String ifthisstringisnotnull,itwillprovidesomecircularcr MediaStore.EXTRA_OUTPUT("output") URI SetthisURitoaFile:///,seeexamplecode


最后把通过Uri获得bitmap的方法给大家贴上

 

publicstaticBitmapgetBitmapFromUri(Uriuri,ContextmContext) { try { //读取uri所在的图片 Bitmapbitmap=MediaStore.Images.Media.getBitmap(mContext.getContentResolver(),uri); returnbitmap; } catch(Exceptione) { e.printStackTrace(); returnnull; } }