【问题标题】:Error: java.io.IOException: No such file or directory in android 11错误:java.io.IOException:android 11 中没有这样的文件或目录
【发布时间】:2021-05-10 10:00:27
【问题描述】:

我正在尝试在文件系统上创建一个文件,但我仍然收到此异常:

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 11

**compileSdkVersion 30

buildToolsVersion "30.0.2"

minSdkVersion 26**

【问题讨论】:

  • directoryFolder.mkdirs() 编码错误。更好:if ( ! directoryFoldes.exists() if ( !directoryFolder.mkdirs()) return;

标签: java android android-studio file kotlin


【解决方案1】:

在 Android 11 设备上,您无法在外部存储的根目录中创建目录或文件。

但是你可以在所有已经存在的公共目录中。

File(Environment.getExternalStorageDirectory(), "sample-take-image")

例如替换为:

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

【讨论】:

    【解决方案2】:

    使用 getExternalFilesDir()getExternalCacheDir()getExternalMediaDirs()(上下文上的方法),而不是 Environment.getExternalStorageDirectory(),因为它已被弃用。

    【讨论】:

      【解决方案3】:
      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) + "/";
                  }
      

      【讨论】:

        猜你喜欢
        • 2021-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-08
        • 2013-11-04
        • 2012-02-18
        相关资源
        最近更新 更多