android调用系统相机、调用系统相册,调用系统图片裁剪报错的解决方案

最近在项目中用到了照相和相册取图剪裁上传头像,就在网上逛了逛,基本都是千篇一律,就弄下来用了用,没想到的是各种各样的奇葩问题就出现了。先给大家看看代码问题慢慢来解决

这是调用相机

[java]  view plain copy
  1. public static File getImageFromCamer(Context context, File cameraFile,  
  2.         int REQUE_CODE_CAMERA, Intent intent) {  
  3.     intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  4.     File fileDir = HelpUtil.getFile(context, "/Tour/user_photos");  
  5.     cameraFile = new File(fileDir.getAbsoluteFile() + "/"  
  6.             + System.currentTimeMillis() + ".jpg");  
  7.     intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile));  
  8.     ((Activity) context).startActivityForResult(intent, REQUE_CODE_CAMERA);  
  9.     return cameraFile;  
  10. }  
在这里我返回了一个file对象,这是应为项目中需要,大家可以不必真写,直接传一个Uri对象过来就好了

下面是调用相册

[java]  view plain copy
  1. public static void getImageFromPhoto(Context context, int REQUE_CODE_PHOTO) {  
  2.         Intent intent = new Intent(Intent.ACTION_PICK, null);  
  3.         intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,  
  4.                 "image/*");  
  5.         ((Activity) context).startActivityForResult(intent, REQUE_CODE_PHOTO);  
  6.   
  7.     }  
当然接下来是调用Activity的OnActivityResult了

[java]  view plain copy
  1. @Override  
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.     if (resultCode == RESULT_OK) {  
  4.         switch (requestCode) {  
  5.         case ConstantUtil.REQUE_CODE_CAMERA:  
  6.             uri = Uri.fromFile(cameraFile);  
  7.             PhotoUtil.startPhotoZoom(context, uri,  
  8.                     ConstantUtil.REQUE_CODE_CROP);  
  9.             break;  
  10.         case ConstantUtil.REQUE_CODE_PHOTO:  
  11.             if (null != data) {//为了取消选取不报空指针用的  
  12.                 uri = data.getData();  
  13.                 PhotoUtil.startPhotoZoom(context, uri,  
  14.                         ConstantUtil.REQUE_CODE_CROP);  
  15.             }  
  16.             break;  
  17.         case ConstantUtil.REQUE_CODE_CROP:  
  18.             if(uri==null){  
  19.                 break;  
  20.             }  
  21.             cropBitmap=HelpUtil.getBitmapFromUri(uri,context);  
  22.             if (cropBitmap != null) {  
  23.                 iv_headphoto.setImageBitmap(cropBitmap);  
  24.   
  25.                 baos = new ByteArrayOutputStream();  
  26.                 cropBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);  
  27.                 headPicString = new String(Base64.encode(  
  28.                         baos.toByteArray(), 0));  
  29.                 UploadPic(headPicString);  
  30.             }  
  31.   
  32.             break;  
  33.         default:  
  34.             break;  
  35.         }  
  36.     }  
当然还有大家关心的剪切
[java]  view plain copy
  1. public static void startPhotoZoom(Context context, Uri uri,  
  2.             int REQUE_CODE_CROP) {  
  3.         int  dp = 500;  
  4.   
  5.         Intent intent = new Intent("com.android.camera.action.CROP");  
  6.         intent.setDataAndType(uri, "image/*");  
  7.         // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪  
  8.         intent.putExtra("crop""true");  
  9.         intent.putExtra("scale"true);// 去黑边  
  10.         intent.putExtra("scaleUpIfNeeded"true);// 去黑边  
  11.         // aspectX aspectY 是宽高的比例  
  12.         intent.putExtra("aspectX"1);//输出是X方向的比例  
  13.         intent.putExtra("aspectY"1);  
  14.         // outputX outputY 是裁剪图片宽高,切忌不要再改动下列数字,会卡死  
  15.         intent.putExtra("outputX", dp);//输出X方向的像素  
  16.         intent.putExtra("outputY", dp);  
  17.         intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());  
  18.         intent.putExtra("noFaceDetection"true);  
  19.         intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);  
  20.         intent.putExtra("return-data"false);//设置为不返回数据  
  21.   
  22.         ((Activity) context).startActivityForResult(intent, REQUE_CODE_CROP);  
  23.     }  

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

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

Exta Options Table for image/* crop:

 

SetExtraDataTypeDescription
cropStringSignals the crop feature
aspectXintAspect Ratio
aspectYintAspect Ratio
outputXintwidth of output created from this Intent
outputYintwidth of output created from this Intent
scalebooleanshould it scale
return-databooleanReturn the bitmap with Action=inline-data by using the data
dataParcelableBitmap to process, you may provide it a bitmap (not tested)
circleCropStringif this string is not null, it will provide some circular cr
MediaStore.EXTRA_OUTPUT ("output")URISet this URi to a File:///, see example code

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

[java]  view plain copy
  1. public static Bitmap getBitmapFromUri(Uri uri,Context mContext)  
  2.      {  
  3.       try  
  4.       {  
  5.        // 读取uri所在的图片  
  6.        Bitmap bitmap = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), uri);  
  7.        return bitmap;  
  8.       }  
  9.       catch (Exception e)  
  10.       {  
  11.        e.printStackTrace();  
  12.        return null;  
  13.       }  
  14.      }  

转载请指明出处: http://blog.csdn.net/hellohhj/article/details/40618763
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值