拍照、相册及裁剪的终极实现(一)——拍照及裁剪功能实现

本文介绍了在Android中实现拍照及裁剪功能的详细步骤,包括仅拍照、拍照及裁剪的初步实现和终极方案。通过Intent调用系统相机和裁剪功能,解决大图片问题,提供源码示例和解决崩溃问题的方法。
摘要由CSDN通过智能技术生成

前言:这段时间也真是忙到死,本来一个月四篇的承诺,眼看就要打破了,咬着牙再出两篇,最近写工程时,遇到拍照和裁剪功能,也真是服了,各种问题有木有,最后终于找着了一个解决方案,就目前来讲,应用在工程中,还没有什么问题。如果大家有碰到问题,欢迎留言交流

 

相关博客:

《拍照、相册及裁剪的终极实现(一)——拍照及裁剪功能实现》
《 拍照、相册及裁剪的终极实现(二)——相册选择及裁剪功能实现》

 

看来很容易的问题,解决起来却也处处是坑,各种问题啊有木有,要吐血了啊有木有,到网上一搜一堆帖子,能用的基本上没有啊有木有,真是服了……

这里有几篇写的比较好的文章,虽然不是终极方案,但也能我起到了启蒙作用,链接如下:

1、《 如何使用Android MediaStore裁剪大图片》

2、《Android大图片裁剪终极解决方案(上:原理分析)》 及其他文章底部链接中的上、中、下三篇

3、《Android 大图片裁切时遇到的问题》  这篇文章写的极好,分析问题非常出众

4、《Android大图片裁剪终极解决方案 原理分析》这个大哥分析的也极好,不过他的终极解决方案在一些手机上行不通

 

一、基础讲解

一般而言,使用拍照和裁剪功能基本上都是使用系统自带的Intent来实现,看起来直接调别人的写好的东东会比较容易,但真正用起来确发现根本不是那回事,找不到源码是个最大的问题,话说我至今都没找到源码的位置,有哪位同学知道源码位置的留言下哦。

言规正转,我们要将别人写好的Intent,那肯定要使用隐式Intent的方式来启用了,这里使用的是匹配Action:MediaStore.ACTION_IMAGE_CAPTURE,具体的值是:

(MediaStore.java)

拍照:(MediaStore.ACTION_IMAGE_CAPTURE)

 

public static final java.lang.String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";

 

启用相册:(Intent.ACTION_GET_CONTENT)

 

public static final java.lang.String ACTION_GET_CONTENT = "android.intent.action.GET_CONTENT";

启用裁剪:

 

com.android.camera.action.CROP

 

有关启用隐式Intent和显式Intent的方式参看这两篇文章:《 intent详解(一)》《intent详解(二)》
要使用相应的功能是通过Intent.PutExtra("key",value);来实现的,对应的KEY和Valude

Exta Options Table for image/* crop:

附加选项 数据类型 描述
crop String 发送裁剪信号
aspectX int X方向上的比例
aspectY int Y方向上的比例
outputX int 裁剪区的宽
outputY int 裁剪区的高
scale boolean 是否保留比例
return-data boolean 是否将数据保留在Bitmap中返回
data Parcelable 相应的Bitmap数据
circleCrop String 圆形裁剪区域?
MediaStore.EXTRA_OUTPUT ("output") URI 将URI指向相应的file:///...,详见代码示例
outputFormat String 输出格式,一般设为Bitmap格式:Bitmap.CompressFormat.JPEG.toString()
noFaceDetection boolean 是否取消人脸识别功能

这些参数是可以选择性使用的,想使用哪个功能就直接写上,不使用就不写,下面我们就一个个试试。这里我会始终将return_data设为false,因为如何设为TRUE,那对于有些手机而言,只会得到缩略图,所以这里一致用URI来输出。而URI在有些手机上也是存在问题的,这里先不谈,先用URI,因为这是网上一致认为的终极方案………………

写在前面:

由于我们会读写SD卡,所以先在AndroidManifest.xml中添加上SD卡的读写权限:

 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

 

二、仅拍照

(1)、核心代码:

我们仅仅使用拍照的功能,而且将其输出到URI中,代码如下:

启用拍照Activity

 

private static final int RESULT_CAMERA_ONLY = 100;

 

先构造一个temp.jpg的URI

 

String path = getSDCardPath();
File file = new File(path + "/temp.jpg");
imageUri = Uri.fromFile(file);


然后通过MediaStore.ACTION_IMAGE_CAPTURE来隐式调起拍照Intent;

 

然后将返回值设为false,并将MediaStore.EXTRA_OUTPU输出指定为 imageUri;

然后将URI的输出格式设为JPEG,这是因为我们在构造URI时,使用的JPG格式:temp.jpg

 

        Intent intent = null;
        intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true);
        startActivityForResult(intent, RESULT_CAMERA_ONLY);

 

大家可能对return-d

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值