android.system.ErrnoException: открыть не удалось: EACCES (В доступе отказано) - PullRequest
0 голосов
/ 12 октября 2018

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

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

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 ().У меня сохранилось разрешение на запись в манифест и применено время выполнения, несмотря на получение этой ошибки.В чем проблема, которую я не мог понять?Пожалуйста, помогите мне в этом.Спасибо.

1 Ответ

0 голосов
/ 12 октября 2018

Я получил решение по вышеуказанной проблеме.

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'
...