现在的App上都会有用户头像或商品图片等,而这些图片一般都是正方形且大小特别小的,要想得到此类的图片就要用到Android系统自带的图片裁剪功能,蒋拍照后的图片选择用户想要的地方进行裁剪。图片裁剪在不同系统版本上应注意的问题,下面就来分析在不同版本上的裁剪代码

安卓7.0之前图片裁剪代码

File temp = new File(sHeadPath , IMAGE_FILE_NAME);
startPhotoZoom(Uri.fromFile(temp));
public void startPhotoZoom(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");// crop=true是设置在开启的Intent中设置显示的VIEW可裁剪intent.putExtra("crop", "true");if(android.os.Build.MODEL.contains("HUAWEI")){//华为特殊处理 不然会显示圆intent.putExtra("aspectX", 9998);intent.putExtra("aspectY", 9999);}else{intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);}// outputX outputY 是裁剪图片宽高intent.putExtra("outputX", 300);intent.putExtra("outputY", 300);intent.putExtra("return-data", true);startActivityForResult(intent, REQUESTCODE_CUTTING);
}

7.0及之后版本

如果蒋以上的代码在安卓7.0系统上运行的话,就会直接报错崩溃,因为在7.0及以后Android禁止在应用的外部公开file://URI,如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。在7.0系统上还需要添加intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);这样的一句话,表示对目标应用临时授权该Uri所代表的文件,否则会报无法加载此图片的错误。

这里的FileProvider我使用了鸿洋大神提供的FileProvider7库生成的uri

File temp = new File(mCameraPath);
Uri fileUri = FileProvider7.getUriForFile(getActivity(), temp);
startPhotoZoom(fileUri);public void startPhotoZoom(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*");// crop=true是设置在开启的Intent中设置显示的VIEW可裁剪intent.putExtra("crop", "true");if(android.os.Build.MODEL.contains("HUAWEI")){//华为特殊处理 不然会显示圆intent.putExtra("aspectX", 9998);intent.putExtra("aspectY", 9999);}else{intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);}// outputX outputY 是裁剪图片宽高intent.putExtra("outputX", 300);intent.putExtra("outputY", 300);intent.putExtra("return-data", true);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);startActivityForResult(intent, REQUESTCODE_CUTTING);}
裁剪完取图片
private void setPicToView(Intent picdata) {Bundle extras = picdata.getExtras();if (extras != null) {Bitmap photo = extras.getParcelable("data");...}}

如果在部分低端机型上还是报错,可能就是手机的内存比较小,直接蒋图片放在Intent中返回,导致传递大小受限制而报错,这样我们只能蒋裁剪的图片不通过Intent返回,而是蒋裁剪的图片通过uri保存在一个存储卡上,注意这里的uri不能使用FileProvider7生成,只能使用Uri.fromFile(new File(filePath))方式,不然会报无法保存经过裁剪的图片错误。

@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if(resultCode != Activity.RESULT_OK) return;switch (requestCode) {case REQUESTCODE_PICK:// 直接从相册获取...break;case REQUESTCODE_TAKE:// 调用相机拍照File temp = new File(mCameraPath);Uri fileUri = FileProvider7.getUriForFile(getActivity(), temp);startPhotoZoom(fileUri);break;case REQUESTCODE_CUTTING:// 取得裁剪后的图片if (data != null) {setPicToView(data);}break;}}public void startPhotoZoom(Uri uri) {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);// 去黑边if(android.os.Build.MODEL.contains("HUAWEI")){//华为特殊处理 不然会显示圆intent.putExtra("aspectX", 9998);intent.putExtra("aspectY", 9999);}else{intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);}// outputX outputY 是裁剪图片宽高intent.putExtra("outputX", 300);intent.putExtra("outputY", 300);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true);String filePath = FileUtil.createFilePath(CROP_PATH, UUID.randomUUID() + ".png");mCropFileUri = Uri.fromFile(new File(filePath));//不能使用以下方式,不然会报无法保存经过裁剪的图片错误//mCropFileUri = FileProvider7.getUriForFile(getActivity(), new File(filePath));intent.putExtra(MediaStore.EXTRA_OUTPUT, mCropFileUri);intent.putExtra("return-data", false);// true:不返回uri,false:返回uri//对目标应用临时授权该Uri所代表的文件intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);startActivityForResult(intent, REQUESTCODE_CUTTING);}
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;}}private void setPicToView(Intent picdata) {//Bundle extras = picdata.getExtras();Bitmap extras = getBitmapFromUri(mCropFileUri, _mActivity);if (extras != null) {//Bitmap photo = extras.getParcelable("data");Bitmap photo = extras;}}

好了,图片裁剪在不同版本上应注意的问题就总结到这,如果还不能解决你的问题,我也么得办法了

参考:

http://blog.csdn.net/lmj623565791/article/details/72859156

Android 7.0图片裁剪问题相关推荐

  1. Android第三方开源图片裁剪截取:cropper

     Android第三方开源图片裁剪截取:cropper 很多app都需要裁剪截取图片作为头像.logo之类,而cropper是github上的一个针对Android平台的.第三方开源图片裁剪截取项 ...

  2. android 上传头像遇到的问题,Android 7.0 图片剪切问题,选择头像上传

    一. 7.0文件地址传输的问题 异常信息:FileUriExposedException: android:name="android.support.v4.content.FileProv ...

  3. Android 头像、图片裁剪

    ClipView 头像.图片裁剪 预览 裁剪圆形 裁剪圆角 裁剪矩形 资源 名字 资源 AAR clip_view.aar Gitee ClipView GitHub ClipView Maven 1 ...

  4. 【Android】Bitmap图片裁剪(91/100)

    自定义裁剪类CropImageView: package top.lc951.myandroid.views;import android.content.Context; import androi ...

  5. android 图片自动裁剪图片大小,android调用原生图片裁剪后图片尺寸缩放的解决方法...

    在安卓开发中,如果对拍照后的图片进行图片裁剪,如果是调用系统的裁剪,如下: /* * 裁剪图片 */ private void cropPhoto() { Intent intent = new In ...

  6. android 固定比例图片裁剪插件,移动端添加图片裁剪的坑

    本文关键:阻止冒泡.canvas压缩.canvas裁剪.生成黑色图片. 最近项目需要在添加图片时实现裁剪功能,虽然 github 上开源的裁剪插件不少,试了好几个插件,在移动端体验好的寥寥无几.躺了几 ...

  7. android 固定比例图片裁剪插件,如何在Android中裁剪不同比例的图像?

    匿名用户 将ImageView放置在ConstraintLayout中. 这将授予ImageView访问app:Layout_ConstraintDimensionRatiane的权限,您可以在其中指 ...

  8. Android 小红书图片裁剪框架,拍摄视频无法自定义拍摄时长

    小红书裁剪框架:https://github.com/yangpeixing/YImagePicker 根据官方的api,传入Long类型的maxDuration,是不起效果的,应该传入int类型的, ...

  9. Android 图片裁剪 (附源码)

    Android 图片裁剪 前言 正文 一.创建并配置项目 二.权限申请 三.获取图片Uri 四.图片裁剪 五.源码 尾声 运行效果图 前言   图片裁剪是对图片进行区域选定,然后裁剪选定的区域,形成一 ...

最新文章

  1. 25亿布局大湾区,创新工场的AI下一站
  2. IT人母亲的美国之行(7)
  3. djngo快速实现--使用Bootstrap
  4. keras从入门到放弃(十七)使用预训练网络VGG迁移学习
  5. 从CSRF原理到CMS漏洞利用
  6. [BUUCTF-pwn]——jarvisoj_tell_me_something
  7. QGIS2.18二次开发环境搭建--番外篇
  8. 8天学通MongoDB——第四天 索引操作
  9. 新手必读:PhoneGap入门六大问题
  10. 蓝宝石rx580怎么超频_台式机显卡怎么选?小百科教你准确定位合理选择(3)
  11. qt设置文本背景透明_QT QWidget设置窗体透明度方法汇总
  12. iOS打包ipa安装包的流程
  13. GLSL-Compute Shader
  14. 重磅!「自然语言处理(NLP)」全球学术界”巨佬“信息大盘点(一)!
  15. 微博热搜榜html源码,几行代码完成微博热搜榜爬虫
  16. 前端实现炫酷动效_7款纯CSS3实现的炫酷动画应用
  17. 周爱民-javascript
  18. 基于SSM小区物业管理系统
  19. 非典型文字描边效果的实现方法
  20. 芯动联科在科创板IPO过会:拟募资10亿元,金晓冬为实际控制人

热门文章

  1. 2021英国硕士计算机专业排名,2020年伦敦国王学院先进的计算机专业硕士申请条件-学费-世界排名...
  2. 伦敦国王学院计算机申请要求,伦敦大学国王学院高级计算机管理理学硕士研究生申请要求及申请材料要求清单...
  3. 贤鱼的刷题日常【c++动态规划】4978:宠物小精灵之收服
  4. 异构网络-元图、知识图谱
  5. ensp运行出现please check whether virtual box is installed 解决方法
  6. 公共数据库介绍~OpenCorporates
  7. 小雷的冰茶几---3386
  8. 支付宝API使用流程
  9. 《MySQL DBA修炼之道》——1.3 查询执行过程概述
  10. ym——Android从零开始(27)(山寨版微信-上)(新)