【发布时间】:2019-07-03 00:48:19
【问题描述】:
我很难弄清楚我的应用发生了什么。各种用户报告说应用程序生成的图像文件已经消失。但是,数据库数据并没有消失,而是存储在公共位置Context.getDatabasePath()。此外,所有文件夹都完好无损,只是缺少图像。
所以我认为 Android 中有一些例行程序导致了这种情况?或者其他一些清理 *.png 文件的应用程序?我知道我的应用不会删除它们,因为我没有任何例程来递归删除所有图像文件。
另外,父文件夹有 .nomedia 文件,所以所有子文件夹都不应该被图库触及,对吧?
我将这些文件存储在以下路径结构中,其中 %d 是唯一编号:
getExternalFilesDir()/projects/p_%d/l_%d/%d.png
这就是我创建项目路径的方式:
public static File getProjectsDir(Context context)
{
// External app directory handled by the OS. Meaning that when the app is uninstalled all
// the data inside this folder will be also removed.
File appRoot = context.getExternalFilesDir(null);
if (null == appRoot) {
Log.e(TAG,"getProjectsDir() -> External storage not accessible!");
return null;
}
File projectsDir = new File(appRoot, "projects");
// create projects directory
if (!projectsDir.exists()) {
if (!projectsDir.mkdir()) {
Log.e(TAG,"getProjectsDir() -> Unable to create projects folder!");
return null;
} else {
File noMediaFile = new File(projectsDir, ".nomedia");
if (!noMediaFile.exists()) {
try {
if (!noMediaFile.createNewFile()) {
Log.e(TAG,"getProjectsDir() -> no media file failed to be created!");
}
} catch (IOException e) {
Log.e(TAG,"getProjectsDir() -> no media file failed to be created!",e);
}
}
}
}
return projectsDir;
}
【问题讨论】:
-
“所以我认为 Android 中的某些程序会导致这种情况?” - 我不知道标准 Android 中有任何东西会从那里删除文件,而不是根据用户请求(例如,设置中的“清除数据”)。缓存目录可以自动清除,至少在存储空间不足的情况下。 “或者其他一些清理 *.png 文件的应用程序?” - 使用外部存储,这当然是可能的。您可以考虑在您的应用程序中添加一些针对这种情况的自动检查,然后将其记录在您可以获取设备详细信息的位置(例如,ACRA 中的静默异常),以寻找共同特征。
-
"父文件夹有 .nomedia 文件,所以所有子文件夹都不应该被图库触及,对吧?" -- 这充其量只是一个约定。
-
@CommonsWare 感谢您的帮助。所以“清除缓存”不会删除我可以确认的项目图像。此外,“CLEAR DATA”会导致数据库和项目文件被删除。所以用户没有做任何这些或操作系统。
-
我有跟踪崩溃的分析,例如 ACRA...但是你建议我做什么样的自动检查?诸如监听文件删除之类的东西?一些细节会很棒!谢谢。
-
“但是你建议我做什么样的自动检查?” -- 当您的应用程序启动时,根据文件系统验证数据库。如果数据库说应该有一个图像,其中
%d是 123,并且没有这样的图像,那么有些东西在你背后删除了那个图像。如果没有图像存在,则所有图像都已删除,这可能值得记录。
标签: android