前言

Android 7.0系统发布后,拿到能升级的nexus 6P,就开始了7.0的适配。发现在Android 7.0以上,在相机拍照和图片裁剪上,可能会碰到以下一些错误:

Process: com.yuyh.imgsel, PID: 22995

// 错误1

android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.yuyh.imgsel/cache/1486438962645.jpg exposed beyond app through ClipData.Item.getUri()

// 错误2

android.os.FileUriExposedException: file:///storage/emulated/0/DCIM/RxGalleryFinal/IMG_20161018180127.jpg exposed beyond app through Intent.getData()

主要是由于在Android 7.0以后,用了Content Uri 替换了原本的File Uri,故在targetSdkVersion=24的时候,部分 “`Uri.fromFile() “` 方法就不适用了。 **File Uri 与 Content Uri 的区别** - File Uri 对应的是文件本身的存储路径 - Content Uri 对应的是文件在Content Provider的路径 所以在android 7.0 以上,我们就需要将File Uri转换为 Content Uri。

具体转换方法如下:

/**

* 转换 content:// uri

*

* @param imageFile

* @return

*/

public Uri getImageContentUri(File imageFile) {

String filePath = imageFile.getAbsolutePath();

Cursor cursor = getContentResolver().query(

MediaStore.Images.Media.EXTERNAL_CONTENT_URI,

new String[] { MediaStore.Images.Media._ID },

MediaStore.Images.Media.DATA + "=? ",

new String[] { filePath }, null);

if (cursor != null && cursor.moveToFirst()) {

int id = cursor.getInt(cursor

.getColumnIndex(MediaStore.MediaColumns._ID));

Uri baseUri = Uri.parse("content://media/external/images/media");

return Uri.withAppendedPath(baseUri, "" + id);

} else {

if (imageFile.exists()) {

ContentValues values = new ContentValues();

values.put(MediaStore.Images.Media.DATA, filePath);

return getContentResolver().insert(

MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

} else {

return null;

}

}

}

那么,我们在裁剪的时候,应该如下调用:

private void crop(String imagePath) {

File file = new File("xxx.jpg");

cropImagePath = file.getAbsolutePath();

Intent intent = new Intent("com.android.camera.action.CROP");

intent.setDataAndType(getImageContentUri(new File(imagePath)), "image/*");

intent.putExtra("crop", "true");

intent.putExtra("aspectX", config.aspectX);

intent.putExtra("aspectY", config.aspectY);

intent.putExtra("outputX", config.outputX);

intent.putExtra("outputY", config.outputY);

intent.putExtra("scale", true);

intent.putExtra("return-data", false);

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));

intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

intent.putExtra("noFaceDetection", true);

startActivityForResult(intent, IMAGE_CROP_CODE);

}

这样就解决了裁剪的问题,但是!!拍照的时候就会出现以下错误:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {

tempFile = new File(FileUtils.createRootPath(getActivity()) + "/" + System.currentTimeMillis() + ".jpg");

LogUtils.e(tempFile.getAbsolutePath());

FileUtils.createFile(tempFile);

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));

startActivityForResult(cameraIntent, REQUEST_CAMERA);

}

android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.yuyh.imgsel/cache/1486438962645.jpg exposed beyond app through ClipData.Item.getUri()

这是因为拍照存储的文件,也需要以Content Uri的形式,故采用以下办法解决:

Step.1

修改AndroidManifest.xml

...>

android:name="android.support.v4.content.FileProvider"

android:authorities="{替换为你的包名}.provider"

android:exported="false"

android:grantUriPermissions="true">

android:name="android.support.FILE_PROVIDER_PATHS"

android:resource="@xml/provider_paths"/>

Step.2

在res/xml/下新建provider_paths.xml文件

Step.3

修改拍照时的参数

cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(getActivity(),BuildConfig.APPLICATION_ID + ".provider", tempFile)); //Uri.fromFile(tempFile)

总结

好了,以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者们能带来一定的帮助,如果有疑问大家可以留言交流。

android 7.0 裁剪,Android 7.0中拍照和图片裁剪适配的问题详解相关推荐

  1. PPT中实现长图片滚动条显示!(详解)

    PPT中实现长图片滚动条显示!(详解) 1.环境是ppt2010 2.点击开发工具. 3.如果没有开发工具 4.在属性里设置.

  2. android 获取图片bitmap对象,Android中Glide获取图片Path、Bitmap用法详解

    脚本之家在此之前给大家介绍过图片加载框架Glide的基本用法介绍,大家可以先参考一下,本篇内容更加深入的分析了Glide获取图片Path.Bitmap用法,以及实现的代码分析. 1. 获取Bitmap ...

  3. Android自定义相机拍照、图片裁剪的实现

    原文:Android自定义相机拍照.图片裁剪的实现 最近项目里面又要加一个拍照搜题的功能,也就是用户对着不会做的题目拍一张照片,将照片的文字使用ocr识别出来,再调用题库搜索接口搜索出来展示给用户,类 ...

  4. android编程 自动裁剪图片,Android编程实现调用相册、相机及拍照后直接裁剪的方法...

    本文实例讲述了Android编程实现调用相册.相机及拍照后直接裁剪的方法.分享给大家供大家参考,具体如下: package com.cvte.health.phone; import java.io. ...

  5. android启动页使用gif,android中使用react-native设置应用启动页过程详解

    一.背景 在我们使用react-native进行编写代码的时候,当启动应用的时候,我们会看到如下界面 然而,这样的启动界面是非常的不又好,那么我们该怎么进行处理启动界面呢?有如下两种方案 二.方案 1 ...

  6. android fragment加载布局的方式,Android中Fragment的加载方式与数据通信详解

    Android中Fragment的加载方式与数据通信详解 发布时间:2020-08-22 18:55:57 来源:脚本之家 阅读:155 作者:Joah 一.加载方式 1. 静态加载 1.1 加载步骤 ...

  7. php ci 处理图片 裁剪,jquery.form + Jcrop + CI框架实现图片裁剪上传

    功能: 1.通过jquery.form上传图片,并按一定比例显示预览图. 2.通过Jcrop裁剪图片,并显示裁剪预览图 3.通过CI的图像处理类保存剪切后图片 问题: 1.通过jquery.form来 ...

  8. 对python3中pathlib库的Path类的使用详解

    原文连接   https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...

  9. JAVA中希尔排序去的讲解_java 中基本算法之希尔排序的实例详解

    java 中基本算法之希尔排序的实例详解 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shel ...

最新文章

  1. windows使用.NET CORE下创建MVC,发布到linux运行
  2. 单独的plsql链接数据库
  3. Quartz Java编程
  4. PHP开发常见功能实现流程
  5. 运动会加油稿计算机学院,信息工程学院运动会加油稿
  6. java序列化深克隆_克隆可序列化和不可序列化的Java对象
  7. java dom xpath_Java:在org.w3c.dom文档中获取元素的xpath
  8. 黑客高手是这样上网的!Vimer是如何用快捷键浏览网页的?
  9. 《php100 视频教程》笔记心得 张恩民 php100 (张迅雷闪击php系列)
  10. 【JY】基于OpenSees和SAP2000静力动力计算案例分析
  11. Oracle 监控索引使用率脚本分享
  12. python中id是什么意思_什么是python的id函数
  13. 数据库事务的四大特性,四种隔离级别,如何避免脏读、不可重复读、幻读(如何加锁)?
  14. 英伟达 Magic3D:一句话生成3D模型,分辨率清晰8倍,速度快2倍,编辑文本还可直接修改...
  15. Coco2d-x 3.x : Cocos Studio 制作的UI无法正确显示,出现绿色或白色底
  16. 修改idea的启动参数,让你的idea健步如飞
  17. 云栖大会倒计时,17个精彩的故事与你一起等待!
  18. GoFrame Step by Step Demo - P1
  19. 虎嗅: 小米盒子vs乐视盒子
  20. Raft源码分析(一) - State

热门文章

  1. ubuntu linux本地源,搭建Ubuntu 12.04 本地源
  2. C++设计模式--抽象工厂模式
  3. 怎么设置某个用户生成hdfs文件的权限_HDFS简明入门教程
  4. 超级大傻瓜代理器_年检尾气通不过咋办?傻瓜才更换三元催化器,聪明人一招解决!...
  5. 彻底关掉win10自动更新_win10系统explorer.exe错误的解决教程
  6. C/Cpp / typeof、_typeof 和 _typeof_ 区别和联系
  7. visio图中包含公式,插入word后公式模糊终极解决办法
  8. 二叉树的三叉链表实现c语言,数据结构:二叉树的三叉链表存储--Java实现
  9. Go 语言新提案:添加模糊测试支持
  10. 当前默认服务器维护尚未完成,HTTP 1.1状态代码及其含义说明