【问题标题】:File cannot be updated in external storage无法在外部存储中更新文件
【发布时间】:2020-12-24 22:46:41
【问题描述】:

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

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 岁),但没有任何效果。

【问题讨论】:

  • myFilePath 的值是多少?
  • @User9211 /storage/emulated/0/Download/myFolder/myFile.txt 我可以打开它,当我编辑和保存时。我看不到反射
  • 将此添加到您的清单文件 - android:requestLegacyExternalStorage="true" .. 和 minSdkVersion 29 .. 它应该可以工作!!试试这个然后告诉我? @摇滚
  • @User9211 我加了,还是一样。

标签: android kotlin android-permissions file-permissions


【解决方案1】:

对于 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()
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2022-01-11
    • 2022-01-21
    相关资源
    最近更新 更多