android照相、相册获取图片剪裁报错的解决方法
作者:mdxy-dxy 发布时间:2021-11-21 20:18:14
这是调用相机
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了
@Overrideprotected 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; } }
猜你喜欢
- 默认路径在Spring Boot 2.7.2版本中,查看默认静态资源路径,在WebProperties.class中如下private st
- socket 编程时的发送与接收数据时的问题在编写一个测试方法时,需要用启动一个程序监听一个端口,测试发送的数据是事正常,但是总是出现两个问
- 项目要求1.初次打开程序时右上角标题栏显示“无连接”,点击旁边的按钮选择“我的好友”,进入配对界面;2.选择好友之后,返回主界面,标题栏会显
- JDK8已发布,写了一个datetime时间函数使用方法的小示例package datetime;import static java.ti
- c#中Math类的方法Math.Abs 已重载。 返回指定数字的绝对值。Math.Acos 返回余弦值为指定数字的角度。Math.Asin
- springboot就是简化Spring应用中的初始化配置,快速创建项目而生的。创建springboot项目代开idea,点击File—&g
- 1. 什么是单例模式单例模式指的是在应用整个生命周期内只能存在一个实例。单例模式是一种被广泛使用的设计模式。他有很多好处,能够避免实例对象的
- 尽管Java提供了一个可以处理文件的IO操作类。 但是没有一个复制文件的方法。 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时
- C#的timer与线程使用卡顿怎么处理,多线程。多线程比timer好读。看看timer和线程的关系。timer有3种1.winform 下的
- 前言本次带来 JVM 的另一块重要内容,类加载机制,不废话,直接开怼。1、类加载的过程。类从被加载到虚拟机内存中开始,到卸载出内存为止,它的
- 建库建表DROP DATABASE IF EXISTS mp;CREATE DATABASE mp DEFAULT CHARACTER SE
- 假定创建了XmlWriter的实例变量xmlWriter,下文中将使用此实例变量写Xml1.如何使用XmlWriter写Xml文档声明//
- 前言在springboot项目中只需一句代码即可实现多个数据源之间的切换:// 切换sqlserver数据源:DataSourceConte
- 1、导入资源2、JSP代码<div class="page-container">  
- 前言随着使用es场景的增多,工作当中避免不了去使用es进行数据的存储,在数据存储到es当中以后就需要使用DSL语句进行数据的查询、聚合等操作
- 在上篇文章,我们介绍了Get方法的设计过程和测试结果,现在我们需要对前面代码进行重构和修改,本篇需要完成以下目标。1)重构Get方法2)如何
- unity贪吃蛇基本原理实现,供大家参考,具体内容如下原理:1、每个身体跟着前面的身体移动;2、蛇头自动一直向前走,可以向左或者向右转弯。思
- 一、BigInteger介绍如果在操作的时候一个整型数据已经超过了整数的最大类型长度 long 的话,则此数据就无法装入,所以,此时要使用
- 本文实例讲述了C#画笔Pen绘制光滑模式曲线的方法。分享给大家供大家参考。具体实现方法如下:using System;using Syste
- Android手势解锁本文讲述的是一个手势解锁的库,可以定制显示隐藏宫格点、路径、并且带有小九宫格显示图,和震动!让你学会使用这个简单,高效