问题描述
我有一个存储文件,我正在尝试将数据写入该文件。但是会抛出异常。
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
。
解决方法
对于API 29(Android 10),
-
确保已授予
android.permission.WRITE_EXTERNAL_STORAGE
。 -
向清单文件中的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()
}
}
}