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

问题描述

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

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:打开失败:EACCES(权限被拒绝)

我已将文件放在上面的路径中,并且我经常反复检查文件是否存在于此位置。但是为什么我不知道FileNotFoundException

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

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

解决方法

对于API 29(Android 10),

  1. 确保已授予android.permission.WRITE_EXTERNAL_STORAGE

  2. 向清单文件中的application元素添加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()
        }
    }
}