错误:java.io.IOException:在Android 11中没有此文件或目录

3

我试图在文件系统上创建一个文件,但仍然出现以下异常:

private fun getTempFolder(): File {
        val directoryFolder =
            File(Environment.getExternalStorageDirectory(), "sample-take-image")
        directoryFolder.mkdirs()
        return directoryFolder
    }
    private fun getTempFile(): File {
        val timeStamp = SimpleDateFormat("yyyyMMdd_HHMMss", Locale.getDefault()).format(Date())
        return File(
            getTempFolder().absolutePath,
            "image".plus(Calendar.getInstance().timeInMillis).plus(timeStamp).plus(".jpg")
        )
    }
    private fun saveImageToFile(bitmap: Bitmap? = null): String? {
        return try {
            val file = getTempFile()
            Timber.e("Path: + : ${file.absolutePath}")
            file.createNewFile()
            val fOut = FileOutputStream(file)
            bitmap?.apply {
                this.compress(Bitmap.CompressFormat.JPEG, 100, fOut)
            }
            fOut.flush()
            fOut.close()
            file?.absolutePath.getDefault()
        } catch (e: Exception) {
            e.printStackTrace()
            ""
        }
    }

即使我在拍照后得到了链接:

: /storage/emulated/0/sample-take-image/image162064003789420210510_160517.jpg

但为什么我不能在这种情况下创建文件呢,请问有谁知道原因吗?我目前使用的是Android 11compileSdkVersion 30

buildToolsVersion "30.0.2"

minSdkVersion 26**

directoryFolder.mkdirs() Bad coding. Better: if ( ! directoryFoldes.exists() if ( !directoryFolder.mkdirs()) return; - blackapps
4个回答

8
在Android 11 设备上,你不能在外部存储的根目录下创建文件夹或文件。
但是你可以在已经存在的所有公共目录中进行操作。
File(Environment.getExternalStorageDirectory(), "sample-take-image")

将 "for instance" 替换为:

File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "sample-take-image")

2
String dirPath;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
                dirPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath() + "/" + getString(R.string.app_name) + "/";
            } else {
                dirPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + getString(R.string.app_name) + "/";
            }

2

使用getExternalFilesDir()getExternalCacheDir()getExternalMediaDirs()(Context的方法),而不是Environment.getExternalStorageDirectory(),因为后者已经被弃用。


0
在我的情况下,缺少权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

还请在应用设置中允许存储权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接