Android:如何在卸载应用时删除外部存储中关联的文件?

9
我正在编写一款应用程序,希望将一些文件永久存储到外部存储器中(这样它们可以在应用程序退出后[被销毁]仍然存在),但是在卸载时,我希望做得体面一些,并删除这些文件以释放存储空间。是否有任何方法可以在卸载时删除这些文件呢?
如果没有(我持怀疑态度),那么我就必须每次都创建这些文件。我试图通过使它们永久存在来节省启动时间并占用所需的空间。
注意:我需要使用外部存储器,因此内部存储器或数据库都不适用。
4个回答

10
实际上这是可能的。
Android会自动删除应用在外部存储中的文件,但这些文件必须位于应用的特定路径内。

"...../Android/data/APP_PACKAGE_NAME/"

APP_PACKAGE_NAME 是应用程序的包名。 另一个自动清空的路径是:

"...../Android/obb/APP_PACKAGE_NAME/" 其中 APP_PACKAGE_NAME 是应用程序的包名。

数据可用于任何您想要的内容。 obb 文件夹用于使用 Play 商店和 apk 扩展库 下载的大型文件。您不应在那里创建文件。


@CompaqLE2202x,你有没有在旧设备/操作系统上卸载过这个应用程序?我记得有些设备会出现这个问题。 - android developer
@androiddeveloper 很抱歉,我的应用程序目标设备运行在4.0及更高版本上。我非常确定使用getExternalStorageDirectory()不会删除其创建的文件,只会删除/Android/data/APP_PACKAGE_NAME/中的文件,但我不知道如何应用它... - Compaq LE2202x
@androiddeveloper 我没有特定的设备,我的应用程序的目标设备运行在Android 4.0及更高版本。此外,我刚刚发现在代码中应用/Android/data/APP_PACKAGE_NAME/的方法是使用getExternalFilesDir(),它相当于Android/data/data/your_package/。这个方法来自于这里 - Compaq LE2202x
@CompaqLE2202x,您测试卸载的设备上安装的Android操作系统版本是多少?根据一些网站显示,它是4.1版本,这很奇怪,因为它相当新。关于目标,我仍然不明白您的意思。您在清单中有什么? - android developer
@androiddeveloper 操作系统版本为4.1.2。目标设备是指我的客户应该使用我的应用程序的设备,它应该从操作系统版本4.0或冰淇淋三明治或更高版本开始。因此,旧设备的问题并不是我真正关心的问题。只是我的应用程序文件有一个外部文件夹,除非我在内部保存它,否则不会被删除。我的清单中的targetSdkVersion为17,minSdkVersion为11。 - Compaq LE2202x
显示剩余7条评论

7

不,我不这么认为。只有您写入内部存储的文件才会在应用程序被卸载时删除(或者如果用户在“应用程序设置”应用中按下“清除数据”按钮)。

您的应用程序也无法接收到自己的PACKAGE_REMOVED广播意图,因此您基本上没有被卸载的通知。


仅作澄清,您不能创建一个广播接收器作为您的应用程序的一部分来监听这个吗? - Ally
1
你可以创建一个广播接收器来监听系统发送的任何PACKAGE_*事件,但是除了在应用程序升级时,你不会收到自己应用程序的这些事件 -- 你将会得到PACKAGE_REMOVED紧随其后是PACKAGE_REPLACED - Christopher Orr

4

是的,这是可能的。只需将文件写入外部文件目录:

File dir = getExternalFilesDir(null);

这将在/Android/data/your.package/创建一个文件夹。请注意,这不是指sdcard中的External,但它是公共可访问的。如果用户卸载您的应用程序,此目录也将被删除,以及其中的所有内容。


2

引用自CommonsWare的博客文章

  • 内部存储:您的文件将被删除。

  • 外部存储:如果您将文件写入根目录位于 getExternalFilesDir()getExternalCacheDir() 的位置,您的文件将被删除。如果您将文件写入其他地方(例如 Environment.getExternalStoragePublicDirectory()),则您的文件不会被删除。

  • 可移动存储,在Android 4.4之前:可移动存储无法正式访问;如果您的文件出现在那里,当您的应用被卸载时,它不应被删除。

  • 可移动存储,在Android 4.4及以后版本:据我所知,如果您写入支持的位置 (getExternalFilesDirs()getExternalCacheDirs()),则仅当该特定可移动存储位于卸载设备中的时间,您的文件才会被删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接