今日在項目中看到過去同事寫的一個相冊讀取圖片並剪切後展示的功能
第一步是通過 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);