Android 正在从getExternalFilesDir()删除图像文件?

Android 正在从getExternalFilesDir()删除图像文件?,android,Android,我很难弄清楚我的应用程序到底发生了什么。许多用户报告说,应用程序生成的图像文件已经消失。但是,数据库数据并没有消失,而是存储在公共位置Context.getDatabasePath()。此外,所有文件夹都保持完整,只是缺少图像 所以我认为Android系统中有一些常规导致了这一点?或者其他清理*.png文件的应用程序?我知道我的应用程序没有删除它们,因为我没有任何例程递归删除所有图像文件 另外,父文件夹有.nomedia文件,所以库不应该接触所有子文件夹,对吗 我将这些文件存储在以下路径结构中,

我很难弄清楚我的应用程序到底发生了什么。许多用户报告说,应用程序生成的图像文件已经消失。但是,数据库数据并没有消失,而是存储在公共位置
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;
}
根据,DownloadManager似乎会从第三方应用中删除超过7天未被访问(即“UI可见”)的任何文件


解决方法是在文件下载后重命名文件,以便DownloadManager不再跟踪它。

“所以我认为Android中有一些例程导致了这种情况?”--我不知道标准Android中有任何东西会删除除用户请求之外的文件(例如,设置中的“清除数据”)。缓存目录可以自动清除,至少在存储容量较低的情况下是如此。“或者其他一些清理*.png文件的应用程序?”——使用外部存储,这当然是可能的。你可能会考虑在你的应用程序中添加一些对这个条件的自动检查,然后将其记录在你可以从中提取设备细节(例如,ACRA中的一个无声异常)中,寻找共同的特征。“父文件夹有.NoMIDA文件,所以所有的子文件夹不应该被画廊所触摸吗?”--这充其量只是一个惯例。@commonware谢谢你的帮助。所以“清除缓存”不会删除我可以确认的项目图像。此外,“清除数据”会导致删除数据库和项目文件。因此,用户没有做任何这些或操作系统。我有分析跟踪崩溃,如ACRA。。。但是你建议我做什么样的自动支票呢?比如监听文件删除?一些细节将是伟大的!Thx。“但是你建议我做什么样的自动检查?”——当你的应用程序启动时,根据文件系统验证数据库。如果数据库说应该有一个
%d
为123的图像,而没有这样的图像,那么某个东西会在你背后删除该图像。如果没有图像,那么所有的图像都被删除了,这可能值得记录。没错!谢谢你的推荐。