@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) { Toast.makeText(SelectPhotoDialogActivity.this, "이미지 처리 오류! 다시 시도해주세요.", Toast.LENGTH_SHORT).show(); } if (requestCode == PICK_FROM_ALBUM) { if(data==null){ return; } photoUri = data.getData(); cropImage(); } else if (requestCode == PICK_FROM_CAMERA) { cropImage(); MediaScannerConnection.scanFile(SelectPhotoDialogActivity.this, //앨범에 사진을 보여주기 위해 Scan을 합니다. new String[]{photoUri.getPath()}, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { } }); } else if (requestCode == CROP_FROM_CAMERA) { try { //저는 bitmap 형태의 이미지로 가져오기 위해 아래와 같이 작업하였으며 Thumbnail을 추출하였습니다.
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), photoUri); Bitmap thumbImage = ThumbnailUtils.extractThumbnail(bitmap, 128, 128); ByteArrayOutputStream bs = new ByteArrayOutputStream(); thumbImage.compress(Bitmap.CompressFormat.JPEG, 100, bs); //이미지가 클 경우 OutOfMemoryException 발생이 예상되어 압축
//여기서는 ImageView에 setImageBitmap을 활용하여 해당 이미지에 그림을 띄우시면 됩니다.
mImageView.setImageBitmap(thumbImage); } catch (Exception e) { Log.e("ERROR", e.getMessage().toString()); } } }
//Android N crop image (이 부분에서 몇일동안 정신 못차렸습니다 ㅜ)
//모든 작업에 있어 사전에 FALG_GRANT_WRITE_URI_PERMISSION과 READ 퍼미션을 줘야 uri를 활용한 작업에 지장을 받지 않는다는 것이 핵심입니다. public void cropImage() { this.grantUriPermission("com.android.camera", photoUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(photoUri, "image/*");
List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 0); grantUriPermission(list.get(0).activityInfo.packageName, photoUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); int size = list.size(); if (size == 0) { Toast.makeText(this, "취소 되었습니다.", Toast.LENGTH_SHORT).show(); return; } else { Toast.makeText(this, "용량이 큰 사진의 경우 시간이 오래 걸릴 수 있습니다.", Toast.LENGTH_SHORT).show(); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); intent.putExtra("crop", "true"); intent.putExtra("aspectX", 4); intent.putExtra("aspectY", 3); intent.putExtra("scale", true); File croppedFileName = null; try { croppedFileName = createImageFile(); } catch (IOException e) { e.printStackTrace(); }
File folder = new File(Environment.getExternalStorageDirectory() + "/test/"); File tempFile = new File(folder.toString(), croppedFileName.getName());
photoUri = FileProvider.getUriForFile(SelectPhotoDialogActivity.this, "com.example.test.provider", tempFile);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.putExtra("return-data", false); intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); //Bitmap 형태로 받기 위해 해당 작업 진행
Intent i = new Intent(intent); ResolveInfo res = list.get(0); i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); grantUriPermission(res.activityInfo.packageName, photoUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); startActivityForResult(i, CROP_FROM_CAMERA);
}
}
|