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

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

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

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

java 复制代码
        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

会提示加载图片失败

java 复制代码
            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;
java 复制代码
    /**
     * 获取下载路径 类型为以上静态变量 可为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();
        }
    }
java 复制代码
 private static String privatePath = Environment.getExternalStorageDirectory().getPath() + "/Android/data/" + AppUtils.getAppPackageName() + "/files";

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

相关推荐
future_li4 分钟前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android
杊页15 分钟前
第一板块:Android 系统基石与运行原理 | 第二篇:Android 编译、打包与安装机制
android·操作系统
故渊at16 分钟前
第十二板块:Android 系统启动与初始化 | 第三十篇:Zygote 孵化机制与 System Server 的启动
android·wms·pms·ams·zygote·ipc
故渊at37 分钟前
第十二板块:Android 系统启动与初始化 | 第二十九篇:Init 进程、RC 脚本与属性服务(Property Service)
android·linux·内存映射·权限控制·init进程·rc脚本·属性服务
故渊at40 分钟前
第十三板块:Android 综合架构与未来演进 | 第三十二篇:Android 内存管理与 LMK 机制的深度剖析
android·架构·内存管理·内存回收·lmk机制·收割算法
故渊at41 分钟前
第十一板块:Android 跨进程通信与 Binder 深度剖析 | 第二十七篇:Binder 线程池与死亡通知(Death Recipient)机制
android·binder·线程池·死亡通知·跨进程通讯
jushi899942 分钟前
FB Neo 街机模拟器全游戏整合版 含25000+街机游戏怀旧复古街机游戏 解压即玩 热门怀旧街机游戏全集安卓+PC电脑版
android·游戏·电脑
vensli43 分钟前
体验专题——Android 应用瘦身实战
android·网络
AFinalStone43 分钟前
Android12 U盘插拔链路源码全解析(七):应用层 —— MediaScanner与SAF
android·frameworks
AI玫瑰助手1 小时前
Python模块:import导入模块与模块的搜索路径
android·开发语言·python