将公共文件保存在内部存储中

Posted

技术标签:

【中文标题】将公共文件保存在内部存储中【英文标题】:Saving public files in the internal storage 【发布时间】:2011-08-11 11:54:34 【问题描述】:

我有一个应用程序可以保存从服务器下载的文件。这些文件不是我的应用程序私有的,其他应用程序也应该可以访问这些文件。我想知道当 SD 卡不存在时保存这些文件的正确路径是什么。对于 SD 卡,有众所周知的 API -

getExternalStorageDirectory()

对于应用程序在内存中的私有数据有-

Context.getFilesDir()

在某些设备上,内部存储器由 /emmc/ 表示。

如果有人能详细说明 /emmc/,那将非常有帮助。我知道它代表嵌入式存储卡,并不存在于所有设备中。但它真的代表内部记忆吗?还是第三段记忆?

我应该使用openFileOutput()MODE_WORLD_READABLE 保存文件吗?

【问题讨论】:

【参考方案1】:

我意识到这是旧的并且有一个公认的答案,但我认为这个问题仍然相关并且有一种方法可以实现提问者想要的。

换句话说,我相信提问者想要保存文件,并使其可供其他应用访问(例如查看),而无需考虑外部存储(例如额外的权限以及外部存储不可用的可能性)存在)。

事实证明,您可以让其他应用程序读取您自己的文件。

File file = new File( ctx.getCacheDir(), "picture" );               
...
file.setReadable( true, false );
  // makes file readable to other apps

// Get another app to view my picture
Uri uri = Uri.fromFile(file);          
Intent intent = new Intent( Intent.ACTION_VIEW );
intent.setDataAndType( uri, "image/*" );
ctx.startActivity( intent );

setReadable 使上面的代码对我有用 - 如果没有该行,查看器应用程序将无法读取文件。请注意,setReadable 对整个目录进行操作,因此最好的解决方案可能是创建一个名为“public”的子目录并将文件放入其中。

【讨论】:

你的救星!公认的答案过于关注为什么你不应该这样做,而不是实际的方法。【参考方案2】:

在某些设备上,内部存储器由 /emmc/ 表示。

/emmc/ 可能存在于某些设备上,它可能是内部的,但应用程序可能无法访问它,而且它肯定不是 android SDK 的一部分,除非恰好是 getExternalStorageDirectory() 返回的内容。

但它真的代表内部记忆吗?

没有。

还是第三段记忆?

询问您的设备制造商。

我应该使用带有 MODE_WORLD_READABLE 的 openFileOutput() 保存文件吗?

这是不可能在摘要中回答的。您说您的文件“也应该可供其他应用程序访问”,但您没有说明为什么您希望任何其他应用程序关心您的文件。其他应用程序不会扫描您的目录中的文件——充其量,它们将允许用户浏览外部存储。拥有MODE_WORLD_READABLE 文件的唯一原因是,如果您的应用程序 将触发另一个应用程序对该文件执行某些操作(例如,ACTION_VIEWIntent)。

【讨论】:

感谢 CommonsWare!是的,我的应用程序使用 ACTION_VIEW 触发其他应用程序正是我将这些文件称为公开的原因。此外,由于一些文件浏览器和应用程序扫描 SD 卡以及内部存储器,我希望他们能够找到这些文件。所以,我的问题仍然存在,如果找不到 SD 卡,文件应该保存在哪里? @Akshay:“另外,由于一些文件浏览器和应用程序会扫描 SD 卡以及内存,我希望他们能够找到这些文件。” - 这是不可能的,或者如果是的话,这是一个主要的安全漏洞。 “所以,我的问题仍然存在,如果找不到 SD 卡,文件应该保存在哪里?” -- getFilesDir(). 谢谢CommonsWare!我试图清楚地理解这一点。我的应用程序可以比作下载附件并允许文档查看器和媒体播放器打开这些文件的电子邮件客户端。如果没有 SD 卡,电子邮件客户端会将文件保存在哪里?内存中没有公共目录吗? /internal_memory/downloads 之类的东西?为什么您会考虑将内部存储器扫描为安全漏洞?只是为了确认一下,内部存储器意味着设备/手机存储器,对吧?很抱歉一连串的问题。 @Akshay:“如果没有 SD 卡,电子邮件客户端会将文件保存在哪里?” -- getFilesDir(),或者除非有 SD 卡,否则不要下载它们。 “内存中没有公开目录吗?” - 不。 “为什么你会考虑扫描内部存储器作为一个安全漏洞?” -- 因为那不应该是可能的。 实际上接受的答案并没有回答主要问题

以上是关于将公共文件保存在内部存储中的主要内容,如果未能解决你的问题,请参考以下文章

如何在内部存储android java中下载和保存媒体文件

在内部存储中保存/读取位图不起作用

如何在内部存储中创建文件夹并保存捕获的图像

Phonegap 下载文件并保存在内部存储中

java.io.FileNotFoundException 在内部存储中保存/加载android

如何从 cordova 应用程序将文件保存在内部存储中?