保护和取消保护文件以避免在 Android 中被错误的清理应用程序意外删除
Posted
技术标签:
【中文标题】保护和取消保护文件以避免在 Android 中被错误的清理应用程序意外删除【英文标题】:Protect and unprotect file to avoid accidental elimination in Android by bugged cleaning apps 【发布时间】:2014-08-16 18:33:57 【问题描述】:在我的 android 应用程序中,我使用一些数据文件保存了一些文件
FileOutputStream savedList = new FileOutputStream(Path);
在 SD 存储中名为 myApp 的文件夹中
不幸的是,我注意到一些没有很好实现的更清洁的应用程序也很受欢迎(例如 CleanMaster)每次用户执行临时\垃圾文件清理时都会错误地删除文件,从而导致问题。
有没有办法以编程方式保护(并取消保护写入)文件以避免这种情况?
如何更改文件权限?
由于没有使用文件扩展名来识别文件格式,我如何更改用于确定文件格式的文件的元数据,以便这些应用程序将这些文件视为文档?我想这些 Cleaners 的扫描使用了一些基于 Linux 文件格式识别的策略,并删除了所有的目标文件。
【问题讨论】:
你试过file.setWritabel(false)
【参考方案1】:
Android 允许在 SD 卡上为应用程序设置私有目录。 您可以按如下方式获取应用的私有目录的路径。
File myDir = getExternalFilesDir(null);
null
参数表示您将在目录中存储任何类型的文件
myDir.mkdirs();
Log.d("info", myDir.getPath());
这些文件在应用程序内部,通常不作为媒体对用户可见。
这类似于getFilesDir()
,在卸载应用程序时这些文件将被删除,但有一些重要区别:
-
共享存储可能并不总是可用,因为用户可以弹出可移动媒体。可以使用
getExternalStorageState(File)
检查媒体状态。
这些文件没有强制执行安全措施。例如,任何持有WRITE_EXTERNAL_STORAGE
的应用程序都可以写入这些文件。
此解决方案对我有用,因为清理设备上的应用程序不会清理这些文件夹,将它们视为各自应用程序的私有文件夹。
从 android 文档中查看以下链接。 Context.getExternalFilesDir(java.lang.String)
【讨论】:
引用您为 getExternalFilesDir(null) 推荐的 Android 文档页面:“这些文件没有强制执行安全性。例如,任何持有 WRITE_EXTERNAL_STORAGE 的应用程序都可以写入这些文件。” (或删除它们...)【参考方案2】:将其写入您的私人内部驱动器,因此他们无权触摸它。 SD 卡只是 FAT32 驱动器,因此它们不支持文件权限或访问列表。
在 4.4 手机上您可能没问题,因为 Google 基本上会阻止对私有目录之外的 SD 卡进行任何写入。无论好坏,更清洁的应用程序根本无法使用它。
【讨论】:
我宁愿避免使用内部存储器,因为低端设备没有太多内部存储,但是私有内部存储路径是什么? (另外我想知道是否有办法屏蔽文件格式以使文件看起来像已知的文档类型文件) activity.getFilesDir() 返回它。但是应该在/data/data/full_app_name目录下【参考方案3】:首先,您应该阅读this question的第一个答案。要记住的事情:
不,Environment.getExternalStorageDirectory() 指的是设备制造商认为是“外部存储”的任何内容。在某些设备上,这是可移动媒体,例如 SD 卡。在某些设备上,这是设备上闪存的一部分。
SD 卡是一个模糊的概念,要 100% 确定您在 SD 卡上写字是不可能的。
也就是说,您应该使用Android API将您的文件写入应用程序的私有目录,位于/path/to/external/storage/whatever/it/is/on/the/device/Android/data/com.package.yourapp/files
使用getExternalFilesDir
获取上面的File
并将你的文件写入你应用的私有目录,这样就没有人可以删除了。
【讨论】:
我不想写在私有目录中,我需要用户也可以轻松访问这些文件的目录,所以不重要知道是物理sd卡还是虚拟存储设备的 sd。我只需要避免被自动清洁器移动。 FAT 32 格式的驱动器不支持权限。此外,/path/to/external/storage/whatever/it/is/on/the/device/Android/data/com.package.yourapp/files
可以被其他应用访问,因此用户将能够访问此目录。
好的,FAT32 不支持权限...但是在 linux 系统上用于确定文件格式的元数据呢?这些清理程序假定所有仅存储对象的文件都是临时文件。如果更改用于确定文件格式的元数据,则问题应该得到解决。
您可以尝试更改文件所有者,但我不知道 android 是否会让您这样做:docs.oracle.com/javase/tutorial/essential/io/…以上是关于保护和取消保护文件以避免在 Android 中被错误的清理应用程序意外删除的主要内容,如果未能解决你的问题,请参考以下文章