Android - обрезка изображения не загружает изображение

Я хочу вырезать фотографию, сделанную из галереи или камеры. Но я не вижу фото при кадрировании. Это просто не приходит. Я беру фото с камеры и начинаю резку. Экран выглядит примерно так:

Камера и onActivityResult

    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

        // Save a file: path for use with ACTION_VIEW intents
        currentPhotoPath = image.getAbsolutePath();
        return image;
    }

    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // Ensure that there's a camera activity to handle the intent
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            // Create the File where the photo should go
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException ex) {
                // Error occurred while creating the File
                Log.d("FotografHata",""+ex);
            }
            // Continue only if the File was successfully created
            if (photoFile != null) {
                Uri photoURI = FileProvider.getUriForFile(this,
                        "com.maksu.aquarium.fileprovider",
                        photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
            }
        }
    }

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
        Uri uri = Uri.parse(currentPhotoPath);
        openCropActivity(uri, uri);
    } else if (requestCode == UCrop.REQUEST_CROP && resultCode == RESULT_OK) {
        Uri uri = UCrop.getOutput(data);
    }
}

openCropActivity

private void openCropActivity(Uri girenUri, Uri cikanUri) {
    UCrop.of(girenUri, cikanUri)
            .withAspectRatio(16, 9)
            .start(this);
}

2 ответа

Решение:

Я использую библиотеку Multi-Picker для использования фотографий из галереи и выбора фотографий. После того, как фотография выбрана, я открываю фотографию - это библиотека ucrop.

поместите ниже класса в свой проект.

Следуя Кодексу:

private String filePath;
private ImagePicker imagePicker;
private CameraImagePicker cameraImagePicker;

private void pickImage() {
        //showProgressBarWithoutHide();

        if (AppUtils.isValidContext(activity)) {
            imagePicker = new ImagePicker(activity);
            imagePicker.setImagePickerCallback(pickerCallback);
            //imagePicker.allowMultiple(); // Default is false
            imagePicker.shouldGenerateMetadata(false); // Default is true
            imagePicker.shouldGenerateThumbnails(false); // Default is true
            imagePicker.pickImage();
        }
    }

    private void cameraImg() {

        if (AppUtils.isValidContext(activity)) {
            if (!SystemUtils.checkForCamera(activity)) {
                Snackbar.make(btnAddToGallery, "Your device doesn't support camera", Snackbar.LENGTH_LONG).show();
                return;
            }
            cameraImagePicker = new CameraImagePicker(activity);
            cameraImagePicker.setImagePickerCallback(pickerCallback);
            cameraImagePicker.shouldGenerateMetadata(false); // Default is true
            cameraImagePicker.shouldGenerateThumbnails(false); // Default is true
            filePath = cameraImagePicker.pickImage();

            Log.i(TAG, "filepath: " + filePath);
        }
    }

 ImagePickerCallback pickerCallback = new ImagePickerCallback() {
    @Override
    public void onImagesChosen(List<ChosenImage> list) {
        try {
            Log.i(TAG, "onImagesChosen() " + list.size());

            if (list.size() == 0) {
                Snackbar.make(btnAddToGallery, R.string.err_failed_to_pick_img, Snackbar.LENGTH_LONG).show();
                return;
            }
            final ChosenImage chosenImage = list.get(0);


            if (AppUtils.isValidContext(activity) && isAdded()) {
                activity.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {

                        if (chosenImage != null) {
                            Log.i(TAG, "getOriginalPath Path:" + chosenImage.getOriginalPath());

                            validateImagePath(chosenImage.getOriginalPath());

                        } else {
                            //hideProgressBar();
                            Snackbar.make(btnAddToGallery, "Failed to choose image", Snackbar.LENGTH_LONG).show();
                            Log.e(TAG, "Failed to choose image");
                        }
                    }
                });
            }
        } catch (Throwable th) {
            th.printStackTrace();
        }
    }

    @Override
    public void onError(String s) {

        //hideProgressBar();
    }


};

private void validateImagePath(String imagePath) {
    String ext = FileUtils.getFileExtension(imagePath);

    Log.i(TAG, "EXT: " + ext);
    if (ext.equals("jpg") || ext.equals("png") || ext.equals("jpeg")) {

        if (imagePath != null) {

            File file = new File(imagePath);
            long length = file.length();

            Log.i(TAG, "File size is: " + length);
            if (length > Constants.MAX_IMAGE_FILE_SIZE) {
                //hideProgressBar();
                Snackbar.make(btnAddToGallery, getString(R.string.err_img_too_large), Snackbar.LENGTH_LONG).show();
                FileUtils.deleteFileFromPath(filePath);
                return;
            }

            filePath = imagePath;
            PerformCrop();

        } else {
            //hideProgressBar();
            Toast.makeText(activity, R.string.err_failed_to_pick_img, Toast.LENGTH_SHORT).show();
        }
    } else {
        //hideProgressBar();
        Snackbar.make(btnAddToGallery, "Please select valid file.", Snackbar.LENGTH_LONG).show();
        Log.e(TAG, "Please select valid file");
    }
}

openCropActivity:

private void PerformCrop() {            
        try {
            Uri sourceUri = Uri.parse("file://" + filePath);
            Uri destUri = Uri.fromFile(new File(activity.getFilesDir(), "U_Crop_Image_" + System.currentTimeMillis() + ".png")); 

            UCrop uCrop = UCrop.of(sourceUri, destUri); //Uri.fromFile(new File(getCacheDir(), destinationFileName))

            uCrop = basisConfig(uCrop);
            uCrop = advancedConfig(uCrop);

            uCrop.start(activity);

        } catch (Throwable e) {
            e.printStackTrace();
        }

    }

onActivityResult:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case Picker.PICK_IMAGE_DEVICE:

                if (resultCode == Activity.RESULT_OK && data != null) {

                    if (imagePicker == null && AppUtils.isValidContext(activity)) {
                        imagePicker = new ImagePicker(activity);
                        imagePicker.setImagePickerCallback(pickerCallback);
                    }
                    if (imagePicker != null) {
                        imagePicker.submit(data);
                    }
                } else {
                    Log.e(TAG, "PICK_IMAGE_DEVICE intent is null or result code is " + resultCode);
                }

                break;
            case Picker.PICK_IMAGE_CAMERA:

                if (resultCode == Activity.RESULT_OK && data != null) {

                    if (cameraImagePicker == null && AppUtils.isValidContext(activity)) {
                        cameraImagePicker = new CameraImagePicker(activity);
                        cameraImagePicker.reinitialize(filePath);
                        // OR in one statement
                        // imagePicker = new CameraImagePicker(Activity.getActivity(), outputPath);
                        cameraImagePicker.setImagePickerCallback(pickerCallback);
                    }
                    if (cameraImagePicker != null) {
                        cameraImagePicker.submit(data);
                    }
                } else {
                    Log.e(TAG, "PICK_IMAGE_CAMERA intent is null or result code is " + resultCode);
                    if (filePath != null && filePath.length() > 0) {
                        PerformCrop();
                    } else {
                        Snackbar.make(btnAddToGallery, R.string.err_failed_to_pick_img, Snackbar.LENGTH_LONG).show();
                    }

                }

                break;
            case UCrop.REQUEST_CROP:
                if (resultCode == Activity.RESULT_OK) {
                    final Uri resultUri = UCrop.getOutput(data);
                    Log.e(TAG, "Cropped image: " + resultUri);

                    try {
                        if (resultUri != null && resultUri.toString().length() > 0) {
                            /* Remove dummy image */
//                            set crop Image... 
                        }
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }

                    //showCropAd();

                } else if (resultCode == UCrop.RESULT_ERROR) {

                    try {
                        final Throwable cropError = UCrop.getError(data);
                        if (cropError != null && cropError.getMessage() != null) {
                            Log.e(TAG, "cropError: " + cropError.getMessage());
                        }
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                }

                break;
          }
    }

Результат:

Демонстрация моего приложения после изображения:

Этот код только для справки. Если вы по-прежнему сталкиваетесь с какими-либо проблемами, сообщите мне. Рад помочь вам.

Я проходил источник и пункт назначения Uriиспользуя Uri.parse(myFile)так он продолжал загружаться

Что сработало для меня, так это то, что я использовал toUri(), как это

      val sourceUri = myFile.toUri()
Другие вопросы по тегам