【问题标题】:Creating internal app directory创建内部应用目录
【发布时间】:2014-02-27 03:09:01
【问题描述】:

我正在尝试创建一个应用特定目录(内部)来存储一些图像。我尝试了很多 SO 答案,但仍然 没有任何效果。 我试过这个from here

File mydir = getApplicationContext.getDir("mydir", Context.MODE_PRIVATE); //Creating an internal dir;

但该目录仍然未创建 - Android/data/com.packagename/...

但是当我运行这个时-

File mediaDir = new File("/sdcard/Android/data/com.packagename");
if (!mediaDir.exists()){
    mediaDir.mkdir();
}

这虽然在内部存储中创建目录,但这是正确的方法吗?

  • 是的,我已经添加了内部读写权限

【问题讨论】:

  • 除了已经提到的误解之外,您需要知道使用内部存储的第一个选项将很难使用应用程序本身以外的任何东西(或在根设备上,如模拟器)进行验证因为这些文件通常对应用程序是私有的,并且在安全设备上运行时对 adb、ddms 或连接的 PC 不可见。
  • 但可以使用adb backup -f file-backup.ab com.packagename.app提取整个目录层次结构

标签: java android storage internal


【解决方案1】:

getApplicationContext().getDir() 不会创建名为 Android/data/com.packagename/ 的文件夹。 如果您记录/打印返回文件的路径,您将看到它是"/data/data/<packagename>/app_mydir/"。这是内部存储应该采用的方式。

如果您想在 sd 卡上创建目录(通常称为外部存储,即使 /sdcard 路径位于内部闪存中),请使用Context.getExternalFilesDir()。这将创建一个文件夹,如"/sdcard/Android/data/<packagename>/files/"

【讨论】:

  • '"/sdcard/Android/data//files/"' 是否对用户直接可见?我的意思是,如果我存储一些图像,它就不会显示在图库中,对吧?
  • 不,它们不会出现在图库中。但如果这是您要使用的位置,请不要在您的应用中对其进行硬编码,而是使用 getExternalFilesdir()。
  • 好的。实际上我认为外部存储是指 SD 卡。无论如何,谢谢。
  • 为什么说那些外部存储文件不会出现在图库中?我希望他们会在媒体扫描仪看到它们后立即(在下次启动时,如果不是因为在文件夹上调用它而更快)
  • 因为系统在/sdcard/Android/data/中创建了一个.nomedia文件
【解决方案2】:

内部存储
要在内部存储中为您的应用查找位置,请使用getFilesDir(),调用任何Context(例如您的Activity,以获取File 对象。

getDir,
http://developer.android.com/reference/android/content/Context.html#getDir(java.lang.String,int)

请看:
http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

为了您的目的,您可以使用

getExternalFilesDir

http://developer.android.com/reference/android/content/Context.html#getExternalFilesDir(java.lang.String)

它返回里面文件夹的路径 SD 卡上的 Android/data/data/your_package/。它用于存储 您的应用程序所需的任何文件(例如从网络下载的图像或 缓存文件)。卸载应用程序后,存储在此应用程序中的任何数据 文件夹也不见了。
还, 从 KITKAT 开始,无需权限即可读取或写入 返回的路径;调用应用程序始终可以访问它。这个 仅适用于为调用的包名生成的路径 应用。要访问属于其他包的路径, WRITE_EXTERNAL_STORAGE 和/或 READ_EXTERNAL_STORAGE 是必需的。

可以查看更多:
http://www.mysamplecode.com/2012/06/android-internal-external-storage.html

http://www.vogella.com/code/ApiDemos/src/com/example/android/apis/content/ExternalStorage.html

对于 API 8 及更高版本,这可以正常工作。

如果您也想对 API 7 及以下版本进行类似的实现,

getExternalStorageDirectory()

它返回您 SD 卡的根路径(例如 mnt/sdcard/)。如果你 将数据保存在此路径并卸载应用程序,该数据不会丢失。

【讨论】:

  • 我希望它在内部存储上。成功创建的目录位于 internal 上。对于外部,如果我将其更改为 sdcard1,它将存储到 SD 卡。但我想要内部。
  • 如果你想要内部存储,那么你应该使用 Context.getDir(),不要担心确切的路径是什么。只需使用该方法返回的内容。不过,我怀疑您对“内部”的含义可能与我的理解不同。如果您解释了您究竟想将存储用于什么目的,这可能会有所帮助。
  • 感谢您的回答和您的时间。
猜你喜欢
  • 2016-05-29
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 2022-08-19
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多