经过很长一段时间没有任何问题的应用程序运行 - 我得到一个报告表格用户说明保存的数据/照片时不时丢失。即它可能最初起作用,但在稍后阶段,内容似乎消失了。我不能复制这个问题,所以我想看看能不能“猜测”它。
首先要确保的是,我不会以最近Android版本不可行的方式保存数据。因此,这是我目前如何保存数据:
...
首先尝试
File storage_files_dir_file = ctx.getExternalFilesDir("");
if (storage_files_dir_file.exists() == false) {
return false;
}
// ... some code here prepping content
os = new FileOutputStream(path_final,true);
// ... some code here writing content
MediaScannerConnection.scanFile(ctx, new String[] {s}, null, null);
return true
如果以上返回false,则切换到
File storage_files_dir_file = ctx.getFilesDir();
if (storage_files_dir_file.exists() == false) {
return false;
}
// ... some code here prepping content
os = new FileOutputStream(path_final,true);
// ... some code here writing content
return true
...
我的AndroidManifest.xml包含
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
...
如果确实是文件问题,我会看到以下可能性:
自从我编写上述代码以来已经有很长一段时间了 - 但我记得我的目标是将数据保存在尽可能永久且易于访问的位置以便于备份。
...
我对该应用的最新更新是在2017年3月。
更新
我想知道问题的罪魁祸首是Android 8 Oreo。我还没有访问过他自己,但从文章看来,现在可以一次性删除应用程序中的照片了吗? +我看过截图,用户可以选择删除app-data和app-cache?如果这是原因:如果使用外部或内部应用程序数据存储有什么区别?还是要防止?
我的应用数据不会受到我在Android 6和Android 7上尝试的任何清理应用的影响,但与仅生产Android手机的所有不同公司相比,我只尝试了相当有限的数量。
...
有谁知道是否可以从他们可以发送的用户那里获取文件删除日志?也许这有助于诊断问题。
答案 0 :(得分:3)
说实话,你的问题听起来更像是一种外部清理。
但无论如何,也许你想看看这个: 自Android 8以来我们也遇到了生成文件的问题,然后我发现了这篇文章: https://developer.android.com/reference/android/support/v4/content/FileProvider.html
我们通过此类提供商更改了文件访问权限,从那时起一切正常。 希望这可以帮助, 干杯格里斯
答案 1 :(得分:2)
- getExternalFilesDir()
如果您的文件与您的应用程序绑定,那么这些文件很简单 太大而不敢冒内部存储,或者如果用户应该 能够随意下载他们设备上的文件,你可以使用
getExternalFilesDir()
,适用于任何活动或其他上下文。这将为您提供指向的File对象 外部存储上自动创建的目录,对您而言是独一无二的 应用。虽然对其他应用程序不安全,但确实如此 一个很大的优势:当你的应用程序被卸载时,这些文件 被自动删除,就像中的一样 应用程序本地文件区域。
- getExternalStoragePublicDirectory()
如果您的文件属于用户而非您的应用程序 - 相机拍摄的照片,下载的MP3文件等 - 更好 解决方案是使用
getExternalStoragePublicDirectory()
,可在Environment类中找到。这将为您提供一个指向a的File对象 根据您的类型为某种类型的文件预留目录 传入getExternalStoragePublicDirectory()
。例如,你 可以要求DIRECTORY_MOVIES
,DIRECTORY_MUSIC
或DIRECTORY_PICTURES
用于存储MP4,MP3或JPEG文件, 分别。 这些文件将在您的应用程序中留下 已卸载。
为防止用户删除应用数据时数据丢失,您可以使用getExternalStoragePublicDirectory()
代替getExternalFilesDir()
如果您的文件属于用户而不是应用