Почему намерение камеры автоматически сохраняет изображения на диск?

Я использую простое намерение камеры, следуя базовому руководству по Android. В этом разделе говорится о сохранении файла изображения на диск. Однако я еще не настроил ни один из этих шагов, но после захвата изображения и возврата к моей активности он по-прежнему автоматически сохраняет мое изображение на диск в /storage/emaulated/0/DCIM/Camera. Похоже, это не то, что подразумевается в руководстве - у меня даже нет разрешения WRITE_EXTERNAL_STORAGE в моем манифесте, поэтому я не уверен, почему ему вообще разрешено записывать на диск. Я не хочу, чтобы изображение автоматически сохранялось в этот каталог, а в каталог по моему выбору. Я знаю, как сохранить изображение в пользовательский каталог, но как я могу предотвратить сохранение изображения по умолчанию в указанном выше каталоге?


person ethan123    schedule 20.04.2015    source источник
comment
Столкнулся с той же проблемой. Вы получили решение?   -  person Ankur Raiyani    schedule 04.12.2015
comment
так что в основном нет решения, потому что на самом деле то, что происходит, похоже, предназначено для Android. когда мы используем код из этого руководства, мы просто используем стандартное приложение камеры на вашем устройстве. поскольку мы не контролируем это приложение, у нас нет возможности предотвратить его встроенное поведение, которое заключается в сохранении фотографий в этот каталог. вы можете ТАКЖЕ сохранить в пользовательский каталог, как описано в других ответах, или попробовать реализовать пользовательскую камеру, что, по меньшей мере, сложно   -  person ethan123    schedule 05.12.2015
comment
Проверьте этот ответ, который я получил по той же проблеме: stackoverflow.com/a/57660942/9242141   -  person Ziad H.    schedule 25.12.2019


Ответы (4)


Когда вы пытаетесь сделать фото, на самом деле вы начинаете звонить в Camera приложение, установленное на вашем устройстве. Вы не установили WRITE_EXTERNAL_STORAGE, да, но приложение Camera установлено. И когда вы пытаетесь сделать снимок, но хотите сохранить фотографию в свой файл, вы можете попробовать это:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
                Uri.fromFile(AVATAR_FILE_TMP));
intent.putExtra("outputFormat",
                Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, TAKING_PICTURE_INDEX);

И filePath - это путь к файлу изображения, который вы берете Camera. Для фотосъемки используется приложение Camera.

person SilentKnight    schedule 20.04.2015
comment
поэтому, если я правильно понимаю это, то для меня происходит то, что новый каталог создается, но файл изображения не записывается должным образом. Совет Динеша работает для записи файла изображения в каталог, но не препятствует тому, чтобы файл также записывается в исходный каталог - person ethan123; 20.04.2015
comment
круто, спасибо еще не совсем получил желаемый эффект. какая часть этого фактически не позволяет приложению «Камера» записывать в свою собственную папку. также, что подразумевается под частью noFaceDetection? мое желаемое поведение состоит в том, чтобы файл был записан только в указанное мной место, а НЕ в папку хранилища/эмуляции/0/DCIM/Camera по умолчанию. Это возможно? - person ethan123; 20.04.2015
comment
тогда вы не устанавливаете outputFormat и noFaceDetection - person SilentKnight; 21.04.2015

Если вы используете следующий код, он не сохранит фотопленку по умолчанию.

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, receiptUri);
startActivityForResult(takePictureIntent, 1);

Но вам нужно разрешение WRITE в вашем манифесте.

person Dinesh T A    schedule 20.04.2015
comment
эй, Динеш, с этим кодом он по-прежнему сохраняется в папку камеры по умолчанию, но также записывается в мою пользовательскую папку. в любом случае, чтобы предотвратить запись в папку по умолчанию и ТОЛЬКО в мою пользовательскую папку? - person ethan123; 20.04.2015

Вот метод, который создает папку с именем для вашего приложения в папке «изображения» на вашей SD-карте. Вы можете изменить его так, чтобы он отражал ваши потребности.

    // Create a File for saving an image or video
    private static File getOutputMediaFile(int type){
        // To be safe, you should check that the SDCard is mounted
        // using Environment.getExternalStorageState() before doing this.

        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                  Environment.DIRECTORY_PICTURES), "MyAppDirectory");
        // This location works best if you want the created images to be shared
        // between applications and persist after your app has been uninstalled.

        // Create the storage directory if it does not exist
        if (! mediaStorageDir.exists()){
            if (! mediaStorageDir.mkdirs()){
                Log.d("MyAppDirectory", "failed to create directory");
                return null;
            }
        }
            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            File mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                "IMG_"+ timeStamp + ".jpg");

            return mediaFile;
}

Вы можете вызвать этот метод, когда вам это нужно:

        File file = getOutputMediaFile(MEDIA_TYPE_IMAGE);
person panonski    schedule 23.04.2015

прокомментируйте эту строку, если есть

MediaStore.Images.Media.insertImage(getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName());
person swati kapoor    schedule 12.01.2018