Android.system.ErrnoException: ошибка открытия: EACCES (в доступе отказано)

Я пробовал эта ссылка Объясняется, что разрешение на запись во внешнее хранилище должно сохраняться за пределами тега приложения. Я уже сохранил это снаружи.

Я помещаю здесь свой код:

cvMain.setDrawingCacheEnabled(true);
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "DEMO_" + timeStamp;
        String path = createWorkingDirectory().getAbsolutePath() + "/" + imageFileName + ".jpg";
        File fileTemp = new File(path);

        if (!fileTemp.exists()) {
            try {
                fileTemp.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        Bitmap b = cvMain.getDrawingCache();
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(fileTemp);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        b.compress(Bitmap.CompressFormat.JPEG, 95, fileOutputStream);
        try {
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        cvMain.setDrawingCacheEnabled(false);

createWorkingDirectory () метод:

private File createWorkingDirectory() {
        File directory = new   File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "demo");
        if (!directory.exists()) {
            directory.mkdirs();
        }
        return directory;
    }

Я получаю эту ошибку в определенное время вызова метода createNewFile (). Я сохранил разрешение на запись внутри манифеста и времени выполнения, хотя и получил эту ошибку. В чем проблема, которую я не мог понять? Пожалуйста, помогите мне в этом. Спасибо.

@MartinZeitler, не то же самое, потому что там запрашивается разрешение на выполнение. Я покончил с этим. Я применил разрешение времени выполнения, и в манифесте Android в нужном месте существует разрешение на запись, но я получаю эту ошибку. Почему не знаю.

Sameer Jani 12.10.2018 09:39
2
2
1 074
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У меня есть решение по вышеуказанной проблеме.

cvMain.setDrawingCacheEnabled(true);
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "DEMO_" + timeStamp;
        String path = createWorkingDirectory().getAbsolutePath() + "/" + imageFileName + ".jpg";
        File fileTemp = new File(path);

        if (!fileTemp.exists()) {
            try {
                fileTemp.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        Bitmap b = cvMain.getDrawingCache();
        OutputStream stream = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Uri filePathUri = FileProvider.getUriForFile(MainActivity.this, "demoApp", fileTemp);
            try {
                stream = getContentResolver().openOutputStream(filePathUri);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            if (stream != null) {
                b.compress(Bitmap.CompressFormat.JPEG, 95, stream);
            }
        } else {
            try {
                stream = new FileOutputStream(fileTemp);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            if (stream != null)
                b.compress(Bitmap.CompressFormat.JPEG, 95, stream);
        }
        try {
            if (stream != null)
                stream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        cvMain.setDrawingCacheEnabled(false);

file_provider.xml

<?xml version = "1.0" encoding = "utf-8"?>
<paths>
    <external-path
        name = "demoApp"
        path = "." />
</paths>

AndroidManifest.xml внутри тега

<provider android:name = "android.support.v4.content.FileProvider"
            android:authorities = "demoApp"
            android:exported = "false"
            android:grantUriPermissions = "true">
            <meta-data
                android:name = "android.support.FILE_PROVIDER_PATHS"
                android:resource = "@xml/file_provider" />    
</provider>

Добавлен build.gradle (приложение)

implementation 'com.android.support:support-v4:27.1.1'

Другие вопросы по теме