Capture And Crop Image In Android 11 (r)
As per android R privacy policy changes, I want to perform the capture and crop image feature for android R devices. I tried the below method but it saving the empty file (file is
Solution 1:
After seeing multiple answers, developer docs, and many more. I ended up with this below working solution, Hope this will help someone.
AndroidManifest
<uses-permissionandroid:name="android.permission.CAMERA" /><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"android:maxSdkVersion="29"/>
android:requestLegacyExternalStorage="true"
<providerandroid:name=".util.GenericFileProvider"android:authorities="${applicationId}.provider.profile"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/provider_paths"/></provider>
PictureSelectorDialog.java
publicstaticfinalintREQUEST_CODE_CAMERA_PICTURE=1232;
publicstaticfinalintREQUEST_CODE_GALLERY_PICTURE=1233;
private File fileUri;
private ImageCapture imageCapture;
privatebooleanisDenied=false;
privatevoidopenGallery() {
Intent intent;
intent = newIntent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(Intent.createChooser(intent, getString(R.string.choose_from_gallery)), REQUEST_CODE_GALLERY_PICTURE);
}
privatevoidopenCamera() {
Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
UriphotoURI=null;
try {
fileUri = Utils.createImageFile(requireContext());
photoURI = FileProvider.getUriForFile(requireContext(), BuildConfig.APPLICATION_ID + ".provider.profile", fileUri);
} catch (IOException e) {
e.printStackTrace();
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(intent, REQUEST_CODE_CAMERA_PICTURE);
}
@OverridepublicvoidonActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PictureSelectorDialog.REQUEST_CODE_CAMERA_PICTURE && resultCode == Activity.RESULT_OK) {
imageCapture.onImageCaptured(fileUri.getAbsolutePath(), false);
} elseif (requestCode == PictureSelectorDialog.REQUEST_CODE_GALLERY_PICTURE && resultCode == Activity.RESULT_OK) {
if (FileUtils.getPath(getActivity(), data.getData()) == null) {
Uriuri= data.getData();
ParcelFileDescriptor parcelFileDescriptor;
try {
parcelFileDescriptor = requireContext().getContentResolver().openFileDescriptor(uri, "r");
FileDescriptorfileDescriptor= parcelFileDescriptor.getFileDescriptor();
Bitmapimage= BitmapFactory.decodeFileDescriptor(fileDescriptor);
parcelFileDescriptor.close();
FiletempFile= createImageFile(requireContext());
ByteArrayOutputStreambos=newByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100 , bos);
byte[] bitmapData = bos.toByteArray();
FileOutputStreamfos=newFileOutputStream(tempFile);
fos.write(bitmapData);
imageCapture.onImageCaptured( tempFile.getAbsolutePath(), true);
fos.flush();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
} else {
imageCapture.onImageCaptured(FileUtils.getPath(getActivity(), data.getData()), false);
}
}
this.dismissAllowingStateLoss();
}
publicinterfaceImageCapture {
voidonImageCaptured(String path, boolean isGooglePhotoURI);
}
Utils.java
publicstatic File createImageFile(Context context)throws IOException {
StringtimeStamp=newSimpleDateFormat(YYYY_MM_DD_HH_MM_SS_FOR_IMAGE_NAMING, Locale.getDefault()).format(newDate());
StringimageFileName="PROFILE_PICTURE_" + timeStamp;
File image, storageDir;
if (SDK_INT < Build.VERSION_CODES.Q) {
storageDir = newFile(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + YOUR_FOLDER_NAME);
if (!storageDir.exists()) {
storageDir.mkdirs();
}
image = newFile(storageDir, imageFileName + ".jpg");
image.createNewFile();
} else {
storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES + File.separator + YOUR_FOLDER_NAME);
image = File.createTempFile(imageFileName, ".jpg", storageDir);
StringcurrentPhotoPath= image.getAbsolutePath();
}
return image;
}
Post a Comment for "Capture And Crop Image In Android 11 (r)"