1

在我们的应用程序中,我们创建了文件夹并通过我们的应用程序将一些图像存储在内部存储中。当用户卸载应用程序时,我想删除这些文件夹和图像。

这是我的代码,以我目前的存储方式:

public void cropImage(Uri sourceUri, String fileName) 
{
    File myDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
            + File.separator
            + getString(R.string.app_name) + File.separator + getString(R.string.app_name_images) + File.separator);
    if (!myDir.exists()) {
        myDir.mkdirs();
    }
    File outputFile = new File(myDir, fileName);

    UCrop.of(sourceUri, Uri.fromFile(outputFile)).start(this);
}
4

2 回答 2

5

好吧,这似乎无法实现,因为我们没有得到任何有关卸载的回调信息。

我在职业生涯中尝试过的事情:

广播接收器:一旦卸载应用程序,它就不再存在于操作系统上,因此无法广播。

因此,他们无法删除在设备外部存储上创建的文件夹。

你可以做什么 :

  • 使用 getExternalCacheDir(),然后在卸载应用程序时自动删除创建的文件夹。

  • 如果您的应用程序目标是 API 8 级或更高级别,您可以使用 Context#getExternalFilesDir() 来处理您的外部文件,这些文件将在卸载时被删除。

于 2018-07-10T05:09:01.773 回答
3

如果您将文件放在文件系统上的随机位置,它们将不会被删除,并且您可能会留下垃圾文件。

如果您将其很好地存储在属于您的应用程序的文件夹中,它们将被自动删除。

好消息是,从某些 Android 版本(Kitkat - 4.4)开始,如果您的所有文件都在应用程序的文件夹中,则您不需要存储权限(链接在这里):

从 Build.VERSION_CODES.KITKAT 开始,读取或写入返回的路径不需要权限;调用应用程序始终可以访问它。这仅适用于为调用应用程序的包名称生成的路径。要访问属于其他包的路径,需要 Manifest.permission.WRITE_EXTERNAL_STORAGE 和/或 Manifest.permission.READ_EXTERNAL_STORAGE。

所以,我的建议:将您自己的临时/私有文件放在应用程序的文件夹中,将用户实际需要的文件(图像/音频/视频/文档/...)放在其他文件夹中

于 2018-07-10T05:24:23.220 回答