Android7.0拍照以及使用uCrop裁剪
来源:互联网 发布:淘宝的淘口令怎么用 编辑:程序博客网 时间:2024/06/05 00:13
一、引入
- Android在7.0中修改了文件权限,所以从Android7.0开始要使用FileProvider来处理uri,从网上找了好多文章,解决了在7.0下拍照及相册选图的问题,但是参照网上的解决方案前切图片一直搞不定,最终使用了UCrop进行剪切图片并返回文件地址,便于与服务器交互。
- 本文主要介绍在Android7.0上进行拍照,相册选图以及相应的图片剪切,当然也会向下兼容,同时我也在Android4.3的手机上进行了测试,在文章最后我会附上源码,会有我自认为详细的注释哈哈。
二、拍照及相册
FileProvider
想必FileProvider大家都很熟悉了,但是想了一下感觉还是写一下比较好。
在manifest中配置
<application ... ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.sdwfqin.sample.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths_public"/> </provider></application>
在 res 目录下新建文件夹 xml 然后创建资源文件 file_paths_public(名字随意,但是要和manifest中的名字匹配)
<?xml version="1.0" encoding="utf-8"?><paths> <!--照片--> <external-path name="my_images" path="Pictures"/> <!--下载--> <paths> <external-path name="download" path=""/> </paths></paths>
调用相机拍照
// 全局变量public static final int RESULT_CODE_1 = 201;// 7.0 以上的uriprivate Uri mProviderUri;// 7.0 以下的uriprivate Uri mUri;// 图片路径private String mFilepath = SDCardUtils.getSDCardPath() + "AndroidSamples";-----------/*** 拍照*/private void camera() { File file = new File(mFilepath, System.currentTimeMillis() + ".jpg"); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // Android7.0以上URI if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //通过FileProvider创建一个content类型的Uri mProviderUri = FileProvider.getUriForFile(this, "com.sdwfqin.sample.fileprovider", file); intent.putExtra(MediaStore.EXTRA_OUTPUT, mProviderUri); //添加这一句表示对目标应用临时授权该Uri所代表的文件 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else { mUri = Uri.fromFile(file); intent.putExtra(MediaStore.EXTRA_OUTPUT, mUri); } try { startActivityForResult(intent, RESULT_CODE_1); } catch (ActivityNotFoundException anf) { ToastUtils.showShort("摄像头未准备好!"); }}
相册选图
// 全局变量public static final int RESULT_CODE_2 = 202;----------private void selectImg() { Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(pickIntent, RESULT_CODE_2);}
onActivityResult
需要注意的是拍照没有返回数据,用之前的uri就可以,从相册查找图片会返回uri
case RESULT_CODE_1: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // 调用裁剪方法 cropRawPhoto(mProviderUri); } else { cropRawPhoto(mUri); } break;case RESULT_CODE_2: Log.i(TAG, "onActivityResult: " + data.getData()); cropRawPhoto(data.getData()); break;
三、图片剪裁(重点)
因为用原生的一直是各种报错,所以我这里用的是UCrop,大家可能都见过官方的展示图,界面可能在有些需求下显得过于复杂,但是真正使用起来感觉有很多都是可以修改的哈哈哈!推荐大家看一下官方的例子。项目地址:https://github.com/Yalantis/uCrop
简单说一下引入方法但是并不能保证是最新的
依赖
compile 'com.github.yalantis:ucrop:2.2.1'
在AndroidManifest中添加Activity
<activity android:name="com.yalantis.ucrop.UCropActivity" android:screenOrientation="portrait" android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
剪切图片
public void cropRawPhoto(Uri uri) { // 修改配置参数(我这里只是列出了部分配置,并不是全部) UCrop.Options options = new UCrop.Options(); // 修改标题栏颜色 options.setToolbarColor(getResources().getColor(R.color.colorPrimary)); // 修改状态栏颜色 options.setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark)); // 隐藏底部工具 options.setHideBottomControls(true); // 图片格式 options.setCompressionFormat(Bitmap.CompressFormat.JPEG); // 设置图片压缩质量 options.setCompressionQuality(100); // 是否让用户调整范围(默认false),如果开启,可能会造成剪切的图片的长宽比不是设定的 // 如果不开启,用户不能拖动选框,只能缩放图片 options.setFreeStyleCropEnabled(true); // 设置源uri及目标uri UCrop.of(uri, Uri.fromFile(new File(mFilepath, System.currentTimeMillis() + ".jpg"))) // 长宽比 .withAspectRatio(1, 1) // 图片大小 .withMaxResultSize(200, 200) // 配置参数 .withOptions(options) .start(this);}
剪切完图片的回掉
case UCrop.REQUEST_CROP: // 成功(返回的是文件地址) Log.i(TAG, "onActivityResult: " + UCrop.getOutput(data)); mCameraTv.setText(UCrop.getOutput(data) + ""); // 使用Glide显示图片 Glide.with(this) .load(UCrop.getOutput(data)) .crossFade() .into(mCameraImg); break;case UCrop.RESULT_ERROR: // 失败 mCameraTv.setText(UCrop.getError(data) + ""); break;
完整的onActivityResult,包含拍照的回掉
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case RESULT_CODE_1: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { cropRawPhoto(mProviderUri); } else { cropRawPhoto(mUri); } break; case RESULT_CODE_2: Log.i(TAG, "onActivityResult: " + data.getData()); cropRawPhoto(data.getData()); break; case UCrop.REQUEST_CROP: Log.i(TAG, "onActivityResult: " + UCrop.getOutput(data)); mCameraTv.setText(UCrop.getOutput(data) + ""); Glide.with(this) .load(UCrop.getOutput(data)) .crossFade() .into(mCameraImg); break; case UCrop.RESULT_ERROR: mCameraTv.setText(UCrop.getError(data) + ""); break; } }}
四、源码
源码地址:https://github.com/sdwfqin/AndroidSamples
阅读全文
0 0
- Android7.0拍照以及使用uCrop裁剪
- Android7.0 头像 拍照、照片裁剪
- android7.0 拍照、相册选图、裁剪实现
- Android7.0适配之FileProvide(拍照,裁剪,应用安装)
- Android7.0调用系统相机拍照、相册选择图片、裁剪
- Android7.0 6.0 相机拍照,系统裁剪适配问题
- uCrop图片裁剪开源库使用总结
- UCrop:图片裁剪开源库详细使用
- android 拍照裁剪以及本地图片裁剪工具类使用
- 对图片裁剪框架 ucrop 的二次封装的工具类,添加从图库选择和拍照获取图片,项目中可直接使用,十分便捷
- 图片裁剪框架ucrop使用前的封装
- 图像裁剪框架uCrop-自我使用发现(1)
- Android7.0 调用相机拍照并裁剪及遇到的坑
- android studio 适配android7.0 android 6.0拍照调用系统裁剪工具实现头像上传功能
- Android7.0完美适配——FileProvider拍照裁剪全解析
- Android7.0调用系统相机拍照、相册选择图片、裁剪 图片压缩
- Android7.0启用摄像头拍照
- Android7.0拍照失败FileUriExposedException
- CentOS安装使用vnc进行远程桌面登录
- leetcode 129. Sum Root to Leaf Numbers
- Java NIO框架简要设计分析
- PHP获取HTML网页内容的多种方法(精)
- 【模板】线段树单点修改
- Android7.0拍照以及使用uCrop裁剪
- Grails3.3框架 脚手架自动生成Controller和View 标准写法
- ssh免密码配置
- Oculus Home安装
- python requests
- Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists).
- poj 2823 Sliding Window(单调队列)
- 反射
- 1050:偶数求和