记一次相册读取图片后找不到目标绝对目录的问题

今日在项目中看到过去同事写的一个相册读取图片并剪切后展示的功能

第一步是通过 Intent.ACTION_GET_CONTENT 进入系统相册进行图片的选择

Intent it = new Intent(Intent.ACTION_GET_CONTENT);
it.setType("image/*");
File dir = new File("/sdcard/LuckyMall/avatar/");
if (!dir.exists()) {
    dir.mkdirs();
}
File file = new File(dir, "newhead.jpg");
imageUri = Uri.fromFile(file);

startActivityForResult(it, SELECT_PICTURE);

第二步是通过 onActivityResult 来获取选择的结果

case MeAccountActivity.SELECT_PICTURE:
                    Uri uri1 = null;
                    if (data == null) {
                        return;
                    }
                    //imageUri = data.getData();
                    // startPhotoZoom(imageUri);
                    uri1 = data.getData();
                    startImageAction(uri1, 320, 320,
                            SAVE_PHOTO, true);
                    break;

第三步是通过 ACTION : com.android.camera.action.CROP 来进行图片裁剪

private void startImageAction(Uri uri, int outputX, int outputY,
                              int requestCode, boolean isCrop) {
    Intent intent = null;
    if (isCrop) {
        intent = new Intent("com.android.camera.action.CROP");
    } else {
        intent = new Intent(Intent.ACTION_GET_CONTENT, null);
    }
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", outputX);
    intent.putExtra("outputY", outputY);
    intent.putExtra("scale", true);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    intent.putExtra("return-data", true);
    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
    intent.putExtra("noFaceDetection", true); // no face detection
    startActivityForResult(intent, requestCode);
}

最后把裁剪结果存储到file里面读取进行展示

但是在第二步的时候出现了一个问题,取到的路径(uri1 = data.getData())是一个ContentResolver接口

例如:content://com.android.providers.media.documents/document/image:397

所以第三步的时候打开摄像机的剪切界面会报错

java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{c0a61ac 25921:com.meizu.media.gallery/u0a22} (pid=25921, uid=10022) requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs

导致没有结果返回,也就没有展示剪切后的图片

简单的检查路径后发现,拍照之后进入剪切界面的功能可以正常使用,也就是说通过file路径进入正常逻辑是可行的

所以按着这个思路,开始寻思如何将ContentResolver接口转化为图片文件的路径

方法姑且想了两个

一、通过接口获得图片数据,存储到文件夹后直接使用生成的文件路径

二、通过接口直接获取文件本身的路径

https://blog.csdn.net/hugh114/article/details/5765332(从ContentResolver获得Uri)

https://blog.csdn.net/yancychas/article/details/76695136(DocumentsContract.Document)

https://blog.csdn.net/qq_35247662/article/details/77532015(把Bitmap存进File)

结果使用了第一种方法进行修改

ContentResolver contentResolver = getContentResolver();
Bitmap bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri1);//获得图片数据
//imageFile uri:imageUri
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(imgFile));
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outputStream);
outputStream.flush();
outputStream.close();
startImageAction(imageUri, 320, 320,
        SAVE_PHOTO, true);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值