Android裁剪图片之后无法加载的问题

news2024/11/19 15:19:51

适配Android11之后更改了图片保存目录,导致裁剪之后图片一直无法加载(fileNotfound)

最主要的问题在于保存裁剪文件的目录不能为私有目录,因为裁剪工具是系统工具,无法直接访问项目本身的私有目录。

解决办法:把裁剪后保存的目录改为公有目录,亲测可用。

        if (uri != null) {
            currentPath = "";
            currentPath = System.currentTimeMillis() + ".jpg";
            File file = new File(Environment.getExternalStoragePublicDirectory(DIRECTORY_PICTURES) + currentPath);
            imageCropUri = Uri.fromFile(file);

            Intent intent = new Intent("com.android.camera.action.CROP");
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                //临时授权该Uri所代表的文件
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            }
            intent.setDataAndType(uri, "image/*");
            // 设置裁剪
            intent.putExtra("crop", "true");
            // aspectX aspectY 是宽高的比例
            intent.putExtra("aspectX", 1);
            intent.putExtra("aspectY", 1);
            intent.putExtra("scale", true);
            // outputX outputY 是裁剪图片宽高
            intent.putExtra("outputX", 150);
            intent.putExtra("outputY", 150);
            //裁剪之后,保存在裁剪文件中,关键
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageCropUri);
            intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
            intent.putExtra("noFaceDetection", true);
            intent.putExtra("return-data", false);
            startActivityForResult(intent, CODE_RESULT_REQUEST);
        }

还有一个问题是拍照之后保存的图片位置,不能放在私有目录的二级目录下,可以放在根目录

比如说私有目录的根目为

/storage/emulated/0/Android/data/packageName/files

直接保存在根目录下加载图片是没有问题的

但是如果保存在二级目录下

/storage/emulated/0/Android/data/packageName/files/test

会提示加载图片失败

            case CODE_CAMERA_REQUEST://拍照
                File file = new File(MyPathUtil.getPrivatePath(null), IMAGE_FILE_NAME);
                Uri imageUri;
                if (hasSdcard()) {
                    File tempFile = new File(MyPathUtil.getPrivatePath(null), IMAGE_FILE_NAME);
                    //获取图片旋转角度
                    int bitmapDegree = MineImageUtils.getBitmapDegree(tempFile.getAbsolutePath());//获取图片选择角度
                    //若图片的旋转角度不是0
                    if (bitmapDegree != 0) {
                        Bitmap nowBitmap = MineImageUtils.rotaingImageView(bitmapDegree, BitmapFactory.decodeFile(tempFile.getPath()));
                        //bitmap转uri
                        Uri uri = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), nowBitmap, null, null));
                        startPhotoZoom(uri);
                    } else {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                            imageUri = MyFileProvider.getUriForFile(this, packageName + ".fileprovider", file);//通过FileProvider创建一个content类型的Uri
                        } else {
                            imageUri = Uri.fromFile(file);
                        }
                        startPhotoZoom(imageUri);
                    }
                } else {
                    showToast("没有SDCard!");
                }
                break;
    /**
     * 获取下载路径 类型为以上静态变量 可为null
     *
     * @param type
     * @return
     */
    public static String getPrivatePath(String type) {
        if (android.os.Build.VERSION.SDK_INT < 30) {
            if (TextUtils.isEmpty(type)) {
                return privatePath;
            } else {
                return privatePath + "/" + type;
            }
        } else {
            //该方法可传一个String类型的参数,表述为该路径下的文件夹,没有该文件夹会自动创建 可传null
            return AppApplication.mContext.getExternalFilesDir(type).getAbsolutePath();
        }
    }
 private static String privatePath = Environment.getExternalStorageDirectory().getPath() + "/Android/data/" + AppUtils.getAppPackageName() + "/files";

参考https://codeleading.com/article/90075423256/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1155155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法---缺失的第一个正数

题目 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。示例 1&#xff1a;输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 示例 2&#xff1a;输入&#xff1a;nums …

一文6个概念带你成功入门自动化测试

自动化测试有以下几个概念&#xff1a; 单元测试集成测试E2E 测试快照测试测试覆盖率TDD 以及 BDD 等 简述 项目开发过程中会有几个经历。 版本发布上线之前&#xff0c;会有好几个小时甚至是更长时间对应用进行测试&#xff0c;这个过程非常枯燥而痛苦代码的复杂度达到了一…

Linux 环境变量 二

目录 获取环境变量的后两种方法 环境变量具有全局属性 内建命令 和环境变量相关的命令 c语言访问地址 重新理解地址 地址空间 获取环境变量的后两种方法 main函数的第三个参数 &#xff1a;char* env[ ] 也是一个指针数组&#xff0c;我们可以把它的内容打印出来看看。 …

线上机器cpu负载200%告警排查

CPU告警排查思路&#xff0c;正常情况就是如下两种情况 执行任务的java线程本身存在bug&#xff0c;死循环或者操作本身耗cpu&#xff0c;导致cpu占用过高jvm发生频繁gc&#xff0c;导致cpu过高 查看耗时较高的进程 top命令&#xff0c;并按大写P以cpu利用率排序&#xff0c;确…

学习笔记3——JVM基础知识

学习笔记系列开头惯例发布一些寻亲消息 链接&#xff1a;https://baobeihuijia.com/bbhj/contents/3/196593.html JVM&#xff08;Write Once&#xff0c;Run Anywhere&#xff09; 以下是一些学习时有用到的资料&#xff0c;只学习了JVM的基础知识&#xff0c;对JVM整体进…

Nginx 部署多个安全域名,多个服务【工作记录】

以下是本人通过Docker 部署的Nginx挂载出来的文件目录 先看下 nginx.conf 配置文件内容&#xff1a;如下 ps&#xff1a;当前文件就是安装后的初始内容&#xff0c;无修改。主要关注最后一行 include /etc/nginx/conf.d/*.conf;表示引入其他目录下的.conf配置文件&#xff1b;…

构建 hive 时间维表

众所周知 hive 的时间处理异常繁琐且在一些涉及日期的统计场景中会写较长的 sql&#xff0c;例如&#xff1a;周累计、周环比等&#xff1b;本文将使用维表的形式降低时间处理的复杂度&#xff0c;提前计算好标准时间字符串未来可能需要转换的形式。 一、表设计 结合业务场景常…

MySQL(5):排序与分页

排序数据 排序规则 使用 ORDER BY 子句排序 ASC&#xff08;ascend&#xff09;&#xff1a;升序 DESC&#xff08;descend&#xff09;&#xff1a;降序 ORDER BY 子句在SELECT语句的结尾 单列排序 SELECT last_name,job_id,department_id,hire_date FROM employees ORDER…

设计师看后惊叹:当泥色走进室内空间的时候竟有此番效果

在美国的洛杉矶&#xff0c;一座引人注目的度假别墅彰显了自己的独特魅力。建筑师 Ron Radziner 说&#xff1a;“这是一座现代住宅&#xff0c;采用风化木、深色灰泥和绿色屋顶等与峡谷环境相关的材料&#xff0c;设计得通透、开放。” Zwickl 解释说&#xff1a;"他们想…

CCF CSP认证 历年真题自练Day42

题目 试题编号&#xff1a; 201512-3 试题名称&#xff1a; 画图 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   用 ASCII 字符来画图是一件有趣的事情&#xff0c;并形成了一门被称为 ASCII Art 的艺术。例如&#xff0c;下图…

正点原子嵌入式linux驱动开发——Linux CAN驱动

CAN是目前应用非常广泛的现场总线之一&#xff0c;主要应用于汽车电子和工业领域&#xff0c;尤其是汽车领域&#xff0c;汽车上大量的传感器与模块都是通过CAN总线连接起来的。CAN总线目前是自动化领域发展的热点技术之一&#xff0c;由于其高可靠性&#xff0c;CAN总线目前广…

axios中get/post请求方式

1. 前言 最近突然发现post请求可以使用params方式传值&#xff0c;然后想总结一下其中的用法。 2.1 分类 get请求中没有data传值方式 经过查阅资料&#xff0c;get请求是可以通过body传输数据的&#xff0c;但是许多工具类并不支持此功能。 在postman中&#xff0c;选择get请求…

WebService接口方式和Restful接口这两者有什么区别和相同点

WebService和RESTful接口都是用于在网络上进行通信和数据交换的技术&#xff0c;但它们在设计和使用上有一些重要的区别和相似之处。 相同点&#xff1a; 基于HTTP协议&#xff1a;无论是WebService还是RESTful接口&#xff0c;它们都是通过HTTP协议进行通信的。 支持多种数据…

高防服务器与CDN防御怎么区分?

​  高防服务器和CDN防御是两种不同的网络安全防护方式。 定义上&#xff1a;高防服务器是指在传统服务器的基础上&#xff0c;增加了一系列的防御措施&#xff0c;如DDoS防护、WAF防护、IP黑白名单等&#xff0c;以提高服务器的抗攻击能力。高防服务器通常具有较强的计算和存…

知识图谱实战应用30-知识图谱在反欺诈情报分析项目中的应用实践

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用30-知识图谱在反欺诈情报分析项目中的应用实践,现代商业环境中,各类欺诈行为日益猖獗,严重影响企业的运营和社会秩序。传统的欺诈检测方法难以满足实时性和有效性方面的要求。本文介绍了采用知识图谱技术构建反欺诈情报…

纳米银簇 银纳米团簇

纳米银簇 名称&#xff1a;纳米银簇 西&#xff09;用途&#xff1a;科研 安&#xff09;描述&#xff1a;银纳米团簇是由数十个银原子组成的超小尺寸簇集体。银纳米团簇具有很高的表面积和独特的光学、电学、催化等性质&#xff0c;因此在生物学、光电子学、催化化学等领域具…

idea自动编译以及修改代码后需要执行 mvn clean install 才生效

idea自动编译以及修改代码后需要执行 mvn clean install 才生效 一. idea热部署一、开启IDEA的自动编译&#xff08;静态&#xff09;二、开启IDEA的自动编译&#xff08;动态&#xff09;三、开启IDEA的热部署策略&#xff08;非常重要&#xff09; 二. IDEA 中项目代码修改后…

笔记软件推荐!亲测好用的8款笔记软件!

​在以往的生活中&#xff0c;我们都需要用纸和笔做笔记&#xff0c;但随着时代的发展&#xff0c;许多人已经不再选择用这种传统方式&#xff0c;来记录自己重要的笔记了&#xff0c;他们都选择将重要的笔记用软件记录下来&#xff0c;将笔记保存在电脑里&#xff0c;更不容易…

一篇文章让你弄懂Java中的方法

目录 1. 方法概念及使用 1.1 什么是方法(method) 1.2 方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系 1.5 没有返回值的方法 2. 方法重载 2.1 为什么需要方法重载 2.2 方法重载概念 2.3 方法签名 1. 方法概念及使用 1.1 什么是方法(method) 方法就是一…

Web3公链之Cosmos生态的项目Celestia

文章目录 Web3公链之Cosmos生态的项目&#xff1a;模块化区块链Celestia什么是CelestiaCelestia网络架构数据可用性问题有哪些可用的解决方案&#xff1f; 发展历史运行节点参考 Web3公链之Cosmos生态的项目&#xff1a;模块化区块链Celestia 什么是Celestia 官网&#xff1a…