android照相、相册获取图片剪裁报错的解决方法
程序员文章站
2022-04-12 12:33:32
这是调用相机
public static file getimagefromcamer(context context, file camerafile...
这是调用相机
public static file getimagefromcamer(context context, file camerafile, int reque_code_camera, intent intent) { intent = new intent(mediastore.action_image_capture); file filedir = helputil.getfile(context, "/tour/user_photos"); camerafile = new file(filedir.getabsolutefile() + "/" + system.currenttimemillis() + ".jpg"); intent.putextra(mediastore.extra_output, uri.fromfile(camerafile)); ((activity) context).startactivityforresult(intent, reque_code_camera); return camerafile; }
在这里我返回了一个file对象,这是应为项目中需要,大家可以不必真写,直接传一个uri对象过来就好了
下面是调用相册
public static void getimagefromphoto(context context, int reque_code_photo) { intent intent = new intent(intent.action_pick, null); intent.setdataandtype(mediastore.images.media.external_content_uri, "image/*"); ((activity) context).startactivityforresult(intent, reque_code_photo); }
当然接下来是调用activity的onactivityresult了
@override protected void onactivityresult(int requestcode, int resultcode, intent data) { if (resultcode == result_ok) { switch (requestcode) { case constantutil.reque_code_camera: uri = uri.fromfile(camerafile); photoutil.startphotozoom(context, uri, constantutil.reque_code_crop); break; case constantutil.reque_code_photo: if (null != data) {//为了取消选取不报空指针用的 uri = data.getdata(); photoutil.startphotozoom(context, uri, constantutil.reque_code_crop); } break; case constantutil.reque_code_crop: if(uri==null){ break; } cropbitmap=helputil.getbitmapfromuri(uri,context); if (cropbitmap != null) { iv_headphoto.setimagebitmap(cropbitmap); baos = new bytearrayoutputstream(); cropbitmap.compress(bitmap.compressformat.jpeg, 100, baos); headpicstring = new string(base64.encode( baos.tobytearray(), 0)); uploadpic(headpicstring); } break; default: break; } }
当然还有大家关心的剪切
public static void startphotozoom(context context, uri uri, int reque_code_crop) { int dp = 500; intent intent = new intent("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);// 去黑边 // aspectx aspecty 是宽高的比例 intent.putextra("aspectx", 1);//输出是x方向的比例 intent.putextra("aspecty", 1); // outputx outputy 是裁剪图片宽高,切忌不要再改动下列数字,会卡死 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住,所以我建议大家不要通过return data 大数据,小数据还是没有问题的,说以我们在剪切图片的时候就尽量使用uri这个东东来帮助我们。
下面是我们进行剪裁用到的一些参数
exta options table for image/* crop:
setextra | datatype | description |
crop | string | signals the crop feature |
aspectx | int | aspect ratio |
aspecty | int | aspect ratio |
outputx | int | width of output created from this intent |
outputy | int | width of output created from this intent |
scale | boolean | should it scale |
return-data | boolean | return the bitmap with action=inline-data by using the data |
data | parcelable | bitmap to process, you may provide it a bitmap (not tested) |
circlecrop | string | if this string is not null, it will provide some circular cr |
mediastore.extra_output ("output") | uri | set this uri to a file:///, see example code |
最后把通过uri获得bitmap的方法给大家贴上
public static bitmap getbitmapfromuri(uri uri,context mcontext) { try { // 读取uri所在的图片 bitmap bitmap = mediastore.images.media.getbitmap(mcontext.getcontentresolver(), uri); return bitmap; } catch (exception e) { e.printstacktrace(); return null; } }