Изображения, удаленные из папки моего приложения, все еще находятся в галерее камеры.

Я пытаюсь удалить изображения, сделанные через API-интерфейс камеры, и, в принципе, он удаляет их из папки моего приложения, но изображения все еще находятся в папке DCIM/camera.

Я использую устройство ITOS с Android версии 9.

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

manifest.xml

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />
------
<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.cameratest.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>

@xml/file_paths
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="external"
        path="." />
    <external-files-path
        name="external_files"
        path="." />
    <cache-path
        name="cache"
        path="." />
    <external-cache-path
        name="external_cache"
        path="." />
    <files-path
        name="files"
        path="." />
</paths>

И вот как я захватываю изображение:

private void checkPermissions(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_PERMISSION_CODE);
            } else {
                captureImage();
            }
        } else {
            captureImage();
        }
    }

private void captureImage() {
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (cameraIntent.resolveActivity(getPackageManager()) != null) {
            File imageFile = null;
            try {
                imageFile = getImageFile();
            } catch (IOException e) {
                Log.d("TAG", "captureImage ERROR: " + e.getMessage());
                e.printStackTrace();
            }

            if (imageFile != null) {
                Uri imageUri = FileProvider.getUriForFile(this, Constants.FILE_AUTHORITY_PROVIDER, imageFile);
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(cameraIntent, CAMERA_REQUEST);
            }
        }

private File getImageFile() throws IOException {
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "IMG_" + timeStamp;
        File storageDir =  new File(this.getExternalFilesDir(Environment.DIRECTORY_PICTURES),"MisFotos");

        if (! storageDir.exists()){
            if (! storageDir.mkdirs()){
                Log.d("MyCameraApp", "failed to create directory");
                return null;
            }
        }

        File image = new File(storageDir.getPath() + File.separator + imageFileName + ".jpg");

        // Save a file: path for use with ACTION_VIEW intents
        currentPhotoPath = image.getAbsolutePath();
        Log.d("PHOTO_TAG", "getImageFile: " + currentPhotoPath);
        return image;
    }

@Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) {
            setPictureToDataBase();
        }
    }

ОБНОВЛЕНО Я сохраняю путь к изображению в базе данных, а затем извлекаю его, чтобы удалить файл.

И вот код, который я использую для удаления изображения в моем адаптере изображения

public void deletePicture(Picture picture) {
        try {

            myDatabase.deletePicture(picture.getUid());
            String path = picture.getImage();//storageDir.getPath() + File.separator + imageFileName + ".jpg"
            pictures.remove(picture);
            notifyDataSetChanged();
            if (pictures != null && pictures.size()>0){
                listener.onDeleteClick( pictures.size());
            }else {
                listener.onDeleteClick( 0);
            }

            File target = new File(path);

            if (target.exists()) {
                target.delete();
            }
            else {
                Log.d("TAG_DELETE_PICTURE", "ERROR: FILE NOT EXITS");
            }
        } catch (Exception e) {
            Log.d("deletePicture", "ERROR: " + e.getMessage());
        }
    }

И когда я открываю проводник устройства, он находится в MyPhotos и в DCIM/камере. то же изображение, два места

Он работает корректно при удалении изображения из папки приложения, но при просмотре в DCIM/камере изображения остаются там и занимают память.

Я делаю что-то не так, есть ли способ удалить изображение, сохраненное в DCIM/камере?

Я хочу сделать фото, сохранить его только в папке приложения, и никуда больше не сохранять. Есть ли другой способ сделать это?


person galexmp    schedule 08.03.2021    source источник
comment
измените эту строку Aquí dejo el código que estoy utilizando. на английский   -  person Espresso    schedule 08.03.2021
comment
Там нет кода, где вы пытаетесь удалить файл. Ни из файловой системы. Ни из MediaStore.   -  person blackapps    schedule 08.03.2021
comment
in principle it does delete them from my application folder but the images are still in the DCIM/camera folder. Мы не знаем, что вы считаете папкой вашего приложения, так как вы не сказали, но кажется невозможным, чтобы они находились на двух местах хранения одновременно. Пожалуйста, объясни.   -  person blackapps    schedule 08.03.2021
comment
File storageDir = new File(this.getExternalFilesDir(Environment.DIRECTORY_PICTURES),"MisFotos"); Если вы действительно используете это, они никогда не попадут в папку ../DCIM/Camera. И они не будут сканироваться MediaStore, и, следовательно, приложения Галереи не будут их отображать.   -  person blackapps    schedule 08.03.2021
comment
Если сценарий действительно соответствует описанию @CommonsWare, вы можете взглянуть на параметр данных onActivityResult. Если data.getData() доставляет uri и uri в папку DCIM/Camera, вы можете немедленно попытаться удалить этот файл.   -  person blackapps    schedule 08.03.2021
comment
Я проверяю, и данные пусты. Это правильно?   -  person galexmp    schedule 08.03.2021


Ответы (1)


Я делаю что-то неправильно

Вы запускаете приложение камеры через ACTION_IMAGE_CAPTURE. Существуют десятки тысяч моделей Android-устройств. На этих моделях устройств будут десятки различных предустановленных приложений для камеры, и пользователи смогут устанавливать другие приложения для камеры из Play Store и других источников.

Что делают эти приложения для камеры, зависит от их разработчиков.

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

Я хочу сделать фото, сохранить его только в папке приложения, и никуда больше не сохранять. Есть ли другой способ сделать это?

Не используйте ACTION_IMAGE_CAPTURE. Вместо этого используйте API-интерфейсы камеры напрямую или через библиотеку-оболочку (Google CameraX, FotoApparat, CameraKit-Android и т. д.).

person CommonsWare    schedule 08.03.2021
comment
Как вы сказали, я решил использовать Camera API напрямую, это лучший вариант. В этом руководстве я нашел простой пример ссылка , чтобы реализовать API и сохранить результат в своей базе данных. Спасибо. - person galexmp; 08.03.2021