android.system.ErrnoException:打开失败:EACCES(权限被拒绝)

android.system.ErrnoException: open failed: EACCES (Permission denied)

我试过了this link 解释说必须在应用程序标签之外保留写入外部存储权限。我已经放在外面了

我将我的代码放在这里:

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() 方法调用时间收到此错误。 我一直在清单和运行时应用中保留写权限,即使出现此错误也是如此。 我无法理解的问题是什么?请帮助我。谢谢。

我得到了关于上述问题的解决方案。

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'