Skip to content Skip to sidebar Skip to footer

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)"