兼容4.4+ 图库/拍照获取图片后裁剪处理

在中,触发程序,拍好照片后,将会返回数据,但是考虑到内存问题,不 会将全尺寸的图像返回给调用的,一般情况下,有可能返回的是缩略图,比如120*160px 。
这是为什么呢?这不是一个Bug,而是经过精心设计的,却对开发者不透明 。
以我的小米手机为例,摄像头800W像素,根据我目前设置拍出来的图片尺寸为3200* 。有人说,那就返回呗,大不了耗1-2M的内存 , 不错 , 这个尺寸的图片确实只有1.8M左右的大小 。但是你想不到的是,这个尺寸对应的会耗光你应用程序的所有内存 。出于安全性考虑,只会给你一个寒碜的缩略图 。
在.3中,默认的为32位,类型是 , 也就意味着一个像素点占用4个字节的内存 。我们来做一个简单的计算题:
3200*2400*4 bytes = 30M
如此惊人的数字!哪怕你愿意为一张生命周期超不过10s的位图愿意耗费这么巨大的内存,也不会答应的 。
have.can have asas 16MB ofto a.
这是 Doc的原文 , 虽然不同手机系统的厂商可能围绕16M这个数字有微微的上调,但是这30M,一般的手机还真挥霍不起 。也只有小米这种牛机,内存堪比个人PC,本着土财主般挥金如土的霸气才能做到 。
处理裁剪的图片
else if (CropPicUtil.PICTURE_CUT == requestCode && data != null && resultCode == -1) {//裁剪成功后返回bitmap = null;Bundle bundle = data.getExtras();if (bundle != null) {bitmap = bundle.getParcelable("data");}Log.e(TAG, "is bitmap null?" + (bitmap == null));if (bitmap == null) {try {bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), tempUri);} catch (IOException e) {e.printStackTrace();Log.e(TAG, "onActivityResult: " + e);}}if (bitmap != null) {...处理}}
先获取返回的数据 。若为null,选择的是使用Uri,否则是使用并返回数据,最后都是使用进行图片处理 。
以上是调用系统图库来获取图片,进行裁剪后做图片处理的方案 。
打开相机拍照获取图片相对来说简单一点,后面的裁剪的流程都一样,就不说了 。
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.EXTRA_OUTPUT, takePotoUri);startActivityForResult(intent, TAKE_PICTURE);
【兼容4.4+图库/拍照获取图片后裁剪处理】相对于通过图库获取图片的方式来说 。拍照不需要进行版本判断,因为图片的路径是自己设定的 。我们通过将自己设定的路径转换为Uri传给系统相机,告诉它拍完的照片放在指定的路径 。然后还是通过获取返回成功或失败的返回状态,做下一步的图片处理 。
else if (TAKE_PICTURE == requestCode && resultCode == RESULT_OK) {CropPicPath = MyApplication.BasePath + System.currentTimeMillis() + ".jpg";tempUri = Uri.fromFile(new File(CropPicPath));FileUtil.copyFile(takePotoPath, CropPicPath);cropPicUtil.startSmallPhotoCrop(tempUri, 240, 240);}
上面贴出的全部都是思路 。并没有完整的代码 。杜绝伸手党 。
本以为这样就可以收工了 , 后来发现6.0+的手机在获取图片的时候崩了 。了之后原来.0以后的版本 , 权限不是一开始就询问是否授权了 。而是运行的时候用到了才问 。
的权限系统一直是首要的安全概念,因为这些权限只在安装的时候被询问一次 。一旦安装了,app可以在用户毫不知晓的情况下访问权限内的所有东西 。
难怪一些坏蛋利用这个缺陷恶意收集用户数据用来做坏事了!
小组也知道这事儿 。7年了!权限系统终于被重新设计了 。在.0棉花糖,app将不会在安装的时候授予权限 。取而代之的是,app不得不在运行时一个一个询问用户授予权限 。
too young too !要成为一名合格的程序猿,第一时间了解最新的变动消息还是很有必要的 。

兼容4.4+  图库/拍照获取图片后裁剪处理

文章插图
简单的解决方式就是在调用图库时请求权限
private static String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};public static final int REQUEST_EXTERNAL_STORAGE = 100;//使用图库或相机时调用public void verifyStoragePermissions(Activity activity) {// Check if we have write permissionint permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);if (permission != PackageManager.PERMISSION_GRANTED) {// We don't have permission so prompt the userActivityCompat.requestPermissions(activity,PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);}}
但作为有追求的工程师,就应该完美的解决问题 。详细的解决方案见微凉一季 的这篇blog
还有一个问题就是在小米手机上,获取图片后不是每一张图片都能显示出来 。正在积极解决…
如果你有有效的解决方案,欢迎留言,大家共同进步!
一个小小的菜鸟第一次发表blog 。希望这篇blog能帮到你,同时也是为了做一下笔记,见证自己的成长之路 。语言组织能力不强,写的不好请小声点喷 。
参考过的blog:
大图片裁剪终极解决方案
4.4从图库选择图片,获取图片路径并裁剪
Demo下载