无法在外部存储中更新文件

File cannot be updated in external storage

我在存储中有一个文件,我正在尝试将数据写入该文件。但是抛出异常os。

val file = File(myFilePath)
val data : String = my_data
var bW: BufferedWriter
try {
    bW = BufferedWriter(FileWriter(file, true));
    bW.write(data);
    bW.newLine();
    bW.flush();
    bW.close();
} catch (e: Exception) {
    Log.d("log", "error = $e")
}

我遇到的错误

java.io.FileNotFoundException: /storage/emulated/0/Download/myFolder/myFile.txt: open failed: EACCES (Permission denied)

我已将文件放在上面的路径中,并且我 cross 经常检查该文件是否存在。但是我不知道为什么我得到 FileNotFoundException

我的 Android 版本是 10 QP1A,我使用的是移动设备 redmi note 8 pro

我尝试了所有存在的解决方案(5 到 8 岁),但没有任何效果。

对于API 29 (Android 10),

  1. 确保您已 android.permission.WRITE_EXTERNAL_STORAGE 获得授权。

  2. android:requestLegacyExternalStorage="true" 添加到清单文件中的应用程序元素。 Reference

例如

AndroidManifest.xml

<manifest ...>

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        ...
        android:requestLegacyExternalStorage="true">
        ...
    </application>

</manifest>

MyActivity.kt

...

        val permissionStatus = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
        if(permissionStatus == PackageManager.PERMISSION_GRANTED) {
            lifecycleScope.launch(Dispatchers.IO) {
                writeToFile()
            }
        } else {
            ActivityCompat.requestPermissions(this@MainActivity,
                arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
                PERMISSION_REQUEST_CODE)
        }

...

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)

        if(grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {
            lifecycleScope.launch(Dispatchers.IO) {
                writeToFile()
            }
        }
    }

...

    @WorkerThread
    private fun writeToFile() {
        val file = File(<myFilePath>)
        val data = <my_data>

        with(BufferedWriter(FileWriter(file, true))) {
            write(data)
            newLine()
            flush()
            close()
        }
    }
}