App卸载后如何删除文件和文件夹?

How delete files and folders when the App is uninstalled?

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

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

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);
}

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

我在职业生涯中的尝试:

BroadCast Receiver : 将无法工作,因为一旦应用程序被卸载,它就不再存在于 OS 上,因此将无法广播。

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

你能做什么:

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

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

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

如果您将其妥善保存在属于您的应用的文件夹中,它们将被自动删除。

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

Starting in Build.VERSION_CODES.KITKAT, no permissions are required to read or write to the returned path; it's always accessible to the calling app. This only applies to paths generated for package name of the calling application. To access paths belonging to other packages, Manifest.permission.WRITE_EXTERNAL_STORAGE and/or Manifest.permission.READ_EXTERNAL_STORAGE are required.

因此,我的建议是:将您自己的 temporary/private 文件放在应用程序的文件夹中,并将用户实际需要的文件 (images/audio/video/documents/...) 放在其他文件夹中