今日在项目中看到过去同事写的一个相册读取图片并剪切后展示的功能
第一步是通过 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);