我需要将一些数据写入文本文件,以便从标准文本编辑器应用程序中读取。在使用targetSdkVersion 27
编译的我的应用程序(在 Android 7.0 上运行)中,我正在通过这种方法进行此操作,该方法有效(或者至少由于我没有经验,这似乎可以工作): / p>
private void storeLocation(Location location) {
try {
FileOutputStream outputStreamWriter;
outputStreamWriter = this.openFileOutput(logPath.getPath(), Context.MODE_APPEND);
outputStreamWriter.write(("LAT: " + location.getLatitude() + "\n").getBytes());
outputStreamWriter.write(("LON: " + location.getLongitude() + "\n").getBytes());
outputStreamWriter.close();
}
catch (Throwable e) {
Log.e("Exception", "File write failed: " + e.getMessage());
}
}
变量logPath
是在应用程序onCreate()
事件处理程序中以这种方式定义的:
File logPath = new File("VIPER_" + getCurrentDateTime() + "_" + UUID.randomUUID().toString() + ".log");
我很难在应用程序专用数据文件夹中找到此文件,但是它不在这里(也许在应用程序关闭后被删除了吗?)。
如果我尝试指定其他文件夹(例如公共下载文件夹等),则会遇到file not found
,read only filesystem
,presence of / character in path
等各种异常情况。
有一种(简单的)方式允许应用程序无需处理FileProvider
实现?
答案 0 :(得分:0)
我发现的解决方案由于某些原因而起作用:
logPath = new File( this.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS), "VIPER_" + getCurrentDateTime() + "_" + UUID.randomUUID().toString() + ".txt");
private void storeLocation(Location location) {
try {
final FileOutputStream outputStreamWriter = new FileOutputStream( logPath, true);
final SimpleDateFormat time_format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.getDefault());
final String line = time_format.format(
new Date()) + String.format(Locale.getDefault(),
" %f %f %f %f\n",
location.getLatitude(),
location.getLongitude(),
location.getAltitude(),
location.getBearing());
outputStreamWriter.write(line.getBytes());
outputStreamWriter.flush();
outputStreamWriter.close();
}
catch (Throwable e) {
Log.e("Exception", "File write failed: " + e.getMessage());
}
}
我真的不知道为什么在以前的代码没有的情况下能运行此代码的原因……也许一个原因是我在第一个示例中使用的openFileOutput()
调用还是Environment.DIRECTORY_DOCUMENTS
我正在使用。可以确定的是,即使文件现在可用,其可用性也不是即时的,而是可能需要可变的时间跨度(从几秒钟到几分钟)。
希望这段代码对某人有帮助。