如何存储Android图片以防止用户删除,但仍允许用户访问

如何存储Android图片以防止用户删除,但仍允许用户访问,android,file,imageview,android-camera,storage,Android,File,Imageview,Android Camera,Storage,我正在开发我的第一个真正的Android应用程序,我遇到了一个用例问题,我似乎找不到最佳实践。该应用程序有一个带有RecyclerView的主屏幕,其中ImageView是构成单个列表项的视图的一部分。单击RecyclerView中的项目将带您进入一个活动,该活动带有一个ViewPager,提供所选项目的详细信息,并允许用户浏览RecyclerView中显示的项目的详细信息。作为添加或编辑项目工作流的一部分,用户可以拍摄一张照片,用于生成RecyclerView的缩略图,并显示在ViewPage

我正在开发我的第一个真正的Android应用程序,我遇到了一个用例问题,我似乎找不到最佳实践。该应用程序有一个带有RecyclerView的主屏幕,其中ImageView是构成单个列表项的视图的一部分。单击RecyclerView中的项目将带您进入一个活动,该活动带有一个ViewPager,提供所选项目的详细信息,并允许用户浏览RecyclerView中显示的项目的详细信息。作为添加或编辑项目工作流的一部分,用户可以拍摄一张照片,用于生成RecyclerView的缩略图,并显示在ViewPager的详细信息片段中。我计划为用户提供在社交媒体、电子邮件或谷歌照片上共享详细信息条目(包括图片)的功能。我的难题是如何在用户设备上存储图片。您可以存储到公共外部存储,该存储由媒体扫描仪扫描,用户可以访问该存储,以便复制到其计算机或共享

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), albumName);

但是,用户也可以删除存储在其中的图片,这会给生成缩略图和在细节片段中显示带来问题

另一种方法是将图片存储到应用程序内部存储器中,如下所示:

File file = new File(getExternalFilesDir(null), "DemoFile.jpg");
当然,这将保护图片不被删除。但是,用户将无法从其计算机或设备上的其他照片应用程序访问该存储位置


我可以在两个位置都存储副本。然而,这似乎是在浪费设备空间。对于这样的用例有什么最佳实践吗?其他人是否愿意分享这种情况的经验?

您可以在缩略图文件夹中放置一个空的
.nomedia
文件。这将阻止媒体扫描仪扫描其中的内容

也就是说,如果你想在卸载你的应用程序时自动删除这些缩略图,我认为这是你想要的,你可以将其绑定到你的特定应用程序


顺便说一句,在Android中,用户就是应用程序本身,因此通过将目录设置为私有,您就将其设置为应用程序本身的私有(而不是设备的实际用户)。但是很明显,如果您将这些缩略图保存在可移动SD卡上,或者如果实际用户在其设备上建立根目录,这些文件将不会真正是私有的。

最好的方法是,通过一个小的.php脚本将用户拍摄的图片上传到服务器,这样可以保证,用户不能简单地删除图片并导致您的应用程序出现故障,同时仍然允许用户在其设备上拥有图像的本地副本。

我不知道它是否存在,但您是否可以通过媒体扫描仪“注册”以“曝光”您私人存储的图像已发送到媒体扫描仪,但用户无法删除?“但是,用户也可以删除存储在其中的图像,这会给生成缩略图和显示在细节片段中带来问题”——那么?它是用户的设备,而不是您的设备。如果用户希望删除这些文件,这是用户的选择,而不是您的选择。“这将保护图片不被删除”——严格来说,这是不正确的。任何用户都可以在“设置”中单击你的应用程序的“清除数据”,这会清除你所有的内部存储。此外,根设备用户可以删除他们想要的任何内容。@commonware,我并不试图阻止用户删除图片本身。我试图主动保护用户,使其不会在不了解图片现在在应用程序中的日志条目中不可用的情况下删除图片。然后,让用户选择是否将图片放在外部存储器上(从任何位置访问,但如果用户移动或删除文件,则为“生活”)或内部存储(仅可从应用程序访问,但可防止意外删除)。“您可以在外部存储上创建一个专用目录,该目录将绑定到您的特定应用程序”——只要不与任何其他内容发生冲突,该目录仅为“专用”。任何应用程序仍然可以读取它(尽管需要Android 4.4到5.1上的
read\u EXTERNAL\u STORAGE
)和写入它(尽管需要
write\u EXTERNAL\u STORAGE
)。在我的使用案例中,我并没有试图阻止用户访问这些图片。我倾向于认为用户可能希望它们的用途超出我的应用程序提供的范围。我只是想找到一种最好的方法,允许用户访问并保护他们在应用程序中的日志条目。如果他们删除或移动图片,该图片将不再在应用程序中可用。用户可能不理解这一结果。因此,我试图主动保护他们的日志条目。“我倾向于认为用户可能希望这些图片用于我的应用程序提供的以外的用途。”因此,允许他们为其他应用程序显式共享/导出/复制这些图片。这样会更安全,对实际用户可能造成的滋扰也会更小。就个人而言,我不喜欢我的gallery应用程序拾取我外部存储中的所有公共图像文件夹。它把一切都弄乱了。另外,把我的设备完全交给别人,让他们在我的图库中看到一张特定的图片,这并不能让我感到舒服,因为其他人可能会开始浏览它的所有文件夹。@Stephanbraczyk,这实际上是一个有趣的混合解决方案,我没有考虑过。默认情况下,图像可以转到私有内部存储,但如果用户需要特定图像,则可以将其“共享”到公共存储,而公共存储只需在那里进行复制。感谢您的回复。我正在独立编写此应用程序。所以,我没有足够的资源支持