Намерение камеры сохраняет изображения в галерею на определенных устройствах

#android #android-intent #camera #android-file #android-camera-intent

#Android #android-намерение #камера #android-файл #android-camera-intent

Вопрос:

Я использую намерение камеры для сохранения изображения в определенную папку, но на устройствах Lenovo дубликат изображения сохраняется в галерее. Как избежать сохранения изображения в галерее и сохранить только в указанной папке?

Вот код, который я использую

     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(context.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
            }
            // Continue only if the File was successfully created
            if (photoFile != null) {
                Uri photoURI = FileProvider.getUriForFile(context,
                        "com.example.fileprovider",
                        photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
            }
        }
    }


    private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(new Date());
        String imageFileName = "JPEG_"   timeStamp   "_";
        File storageDir = context.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;
    }
  

Комментарии:

1. «на устройствах Lenovo изображение также сохраняется в галерее» — галерея — это приложение, а не каталог файловой системы. Вы имеете в виду, что изображение индексируется MediaStore , и поэтому приложение галереи показывает изображение из того места, где вы просили сохранить изображение? Если это так, то это было решение Lenovo, и другие приложения для камеры могут делать то же самое. Вы могли бы рассмотреть возможность использования FileProvider и сохранить изображение на камере getFilesDir() , поэтому MediaStore оно вообще не может быть проиндексировано.

2. галерея не показывает изображение из того места, которое я попросил сохранить изображение. Дело в том, что создаются 2 копии изображения, одна сохраняется там, где я указал для сохранения, а другая сохраняется в папке DCIM / Camera, и галерея захватывает это изображение из папки DCIM / Camera. Я хочу избежать сохранения копии изображения в папке DCIM / Camera.

3. Хорошо, это тоже зависит от приложения камеры. Разработчики приложения камеры либо сделали это намеренно, либо имеют ошибку, ни одну из которых вы не можете изменить. Более того, ваш код может использовать любое из сотен приложений для камеры, в зависимости от того, что установил пользователь. Ваши варианты — либо смириться с этим поведением, либо прекратить использование ACTION_IMAGE_CAPTURE и делать фотографии другим способом. Например, вы могли бы использовать библиотеку камеры, такую как CameraX, Fotoapparat или CameraKit-Android.