问题标签 [android-external-storage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
2531 浏览

android - 在多个 Android 应用程序之间共享和持久化数据

我正在开发一组需要共享通用状态和配置设置的复杂 Android 应用程序。

例如,看这张解释我的场景的图片:

在此处输入图像描述

我希望 APP 1、APP 2 和 APP 3 能够访问(读/写)数据到公共存储区域。此外,我需要卸载保护,即我不希望在用户卸载任何应用程序时删除数据。

我已经阅读了关于 SQLite 数据库、ContentProviders 以及内部和外部存储的写作,但上述每种方法都有如下所列的缺点:

  • SQLite 数据库:DB 在应用程序卸载时被删除,并且对每个应用程序都是私有的
  • ContentProvider:移除带有 ContentProvider 的应用时,数据被移除
  • 内部存储:对每个应用程序都是私有的,并且在应用程序卸载时会删除数据(http://developer.android.com/training/basics/data-storage/files.html#InternalVsExternalStorage
  • 外部存储:不可靠(用户可以移除 SD 卡)
  • 存储在服务器上:不可能,用户可能没有可靠的互联网连接

编辑:

我不希望对 Google Play 服务有任何依赖,因为我将通过 Play 商店分发应用程序并作为第 3 方下载。

请帮帮我。

0 投票
0 回答
148 浏览

android - 我想将位于外部存储设备(sd 或 usb)上的 .dat 文件的内容存储到字符串中?

如果这个问题或类似问题已经得到解决,我提前道歉,但是从我在本网站和其他网站上的搜索来看,我未能解决我的问题。

正如问题标题所暗示的,我希望将位于外部 USB 或 sd 卡上的 *dat 文件的内容存储到我的主要活动中的字符串变量中以供进一步处理。我是 java 和 android 应用程序开发的新手,几天前才开始修修补补(我是一名嵌入式设计/机器人工程师,只有用 c/c++ 为微控制器编写固件的经验)。

任何人都可以建议一种方法来做到这一点,提供代码示例,或提供指向文档或库(或类)的链接,我可以使用这些链接来简化我的工作吗?我已经为此苦苦挣扎了几个小时,尝试使用网络上的各种代码片段。如果可以,请解释您的回复,我是 java、应用程序开发和 android 的新手。

另外,我是否需要编辑清单以允许读取文件?如果是这样,怎么做?

提前致谢,

迦勒

0 投票
0 回答
214 浏览

java - 如何访问 android 上的可移动存储 dcim 目录?

我了解外部存储和可移动存储之间的区别。

我正在制作一个可以访问图片的应用程序(到目前为止基本上只是一个文件浏览器)。我的照片目前保存在我的可移动存储设备上。

当我使用 Environment.getExternalStorageDirectory() 时,它给了我 sdcard0- 这是外部的。我的可移动存储是 sdcard1 - 我怎样才能访问它?

谢谢您的帮助!

0 投票
1 回答
385 浏览

android - 我们将 Android 手机的内置内存视为内部存储还是外部存储?

这里的Android 文档说:

“每个 Android 兼容设备都支持共享的“外部存储”,您可以使用它来保存文件。这可以是可移动存储介质(例如 SD 卡)或内部(不可移动)存储。文件保存到外部存储是全球可读的,并且可以在用户启用 USB 大容量存储以在计算机上传输文件时进行修改。”

这意味着内置内存也被视为外部内存,但相同的文档还说:

“为了在外部存储上读取或写入文件,您的应用必须获得 READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE 系统权限”

我无需在 manifest.xml 文件中请求任何权限即可读取内部存储的内容。我正在使用以下代码来执行此操作:

这两种说法不矛盾吗?内置存储是内部的还是外部的?

0 投票
1 回答
67 浏览

java - 在外部存储中编辑文件

在我的应用程序中,我正在编写一个文件并将其存储在外部存储中

但是每次我想编辑它时,我都必须获取文件的数据,将其删除,然后使用新数据重新创建它。

但是有没有办法直接编辑现有文件而不是删除和重新创建它?

0 投票
1 回答
1914 浏览

android - Android 应用能否获得对 /mnt/asec 或 /mnt/obb 的写入权限?

我有一个在外部 SD 卡上执行写操作的应用程序(外部而不是设备闪存中的“外部”),但是正如这里和其他很多问题中已经彻底讨论过的那样,似乎有没有通用方式/支持的 API 来检索适用于不同制造商的每部手机的 SD 卡安装点。

考虑到这一点,需要执行类似于以下代码的操作来确定是否安装了外部存储设备以及安装位置:

我可能是错的,但我知道 SD 卡可能是完全空的,最后一个条件(file.listFiles().length > 0)可能会返回false。所以我想,而不是检查length,我会添加file.canWrite(). 这在我目前正在测试的手机上按预期工作(摩托罗拉 Atrix MB860 - 我知道它很旧,但我的要求之一是使其与从 Gingerbread、API 9 开始的版本兼容),但我不确定是否该条件可以返回 true/mnt/asec/或其他手机,无论是否最近,因为它们的两个可读目录,因此也满足前两个条件(如果它上面写了一些东西(比如 50MB+ 大小的文件) /mnt/obb,甚至可以true返回。(file.listFiles().length > 0)/mnt/obb

所以,简而言之,我需要知道的是一个应用程序是否会对这两个位置有写权限,或者是否只有系统有这样的权限。如果是,我还可以检查什么以将它们从我希望获得的最终路径中排除:安装在设备上的外部 SD 卡?

预先感谢您的任何帮助!

0 投票
1 回答
67 浏览

android - 当 APK 安装在 SD 卡上时会发生什么?

假设我们想在Android 手机上安装一个名为x.apk的 APK。

默认情况下,至少会发生两件事:

  1. x.apk复制到/data/app;

  2. 在下创建一个包文件夹/data/data作为私有存储空间;

但是,如果x.apk要安装在 SD 卡上,

SD卡对应的文件夹是什么/data/app/data/data

0 投票
3 回答
3508 浏览

android - 下载的文件在 Android 4.4.2 中丢失

我们正在使用内置DownloadManager从我们的服务器获取文件。如果我们发现该文件有更新,我们将删除本地版本并从DownloadManager. 这仅在您完全终止并重新启动应用程序时运行(及时更新文件不是优先事项,只是我们拥有所有文件并且只要我们注意到它们就会更新)。该系统在我所有的个人测试设备上都能完美运行,但是,在 api 19 模拟器或我同事的 HTC One 上进行测试时,文件将下载然后消失(不再位于应用程序的外部数据文件夹中)。我发现两者都是 android 的 4.4.2 版本(我的设备是 4.4.4 或 4.0.4)。这很奇怪,因为它们会停留一段时间,但随后随机文件会消失。

这是一些代码:

AssetManager 设置(输出文件夹的设置)

下载代码

如果您需要任何其他信息或代码,请告诉我!

编辑1

所以我决定通过我的测试来详细说明这个问题,以及这个问题是如何表现出来的,希望它能让画面更加清晰!

我首先通过 Android Studio 加载应用程序并让它运行足够长的时间以知道所有下载都已完成,然后我查看应用程序以查看哪些图像存在,哪些图像丢失。大多数图像正常存在。接下来我退出应用程序并使用 android 任务管理器完全杀死它。然后我通过 Android Studio 重新启动该应用程序。然后我等待确保下载完成并观察 LogCat 以查看哪些文件被手动删除(通常最多几个)。然后我通过应用程序查看哪些图像仍然存在/哪些已添加。似乎每次出现新图像并且新图像消失时......通常那些被标记为手动删除的图像实际上通过正确下载被替换(即没有“消失”)。

如果您想让我做任何测试,请告诉我!

文件观察员测试

首先,这是我第一次使用 aFileObserver所以如果我做了一些愚蠢的事情,请指出。这是我的观察者代码:

我正在使用处理程序,因为起初我没有startWatching()覆盖并且根本没有得到任何日志记录,并且文档说 onEvent 发生在它自己的线程上,因此您应该使用处理程序。课堂上就是这样:

我从中得到的唯一输出是“开始观看!!!”。所以我猜我一定做错了什么,因为我看到它正在下载/删除东西……至少它说的是。

0 投票
1 回答
42 浏览

android - 运行 API +11 的所有设备上是否存在外部存储?

我将使用安卓下载管理器。我必须担心外部存储的存在吗?有没有没有外部存储的设备?

我认为可移动 SD 卡和外部存储是两个不同的东西。我对吗?

0 投票
1 回答
1275 浏览

android - 无法 ACTION_VIEW 外部存储上的文件

我的 Android 手机的外部存储中有一个文件(在这种情况下是模拟的)。知道它的路径和/或有一个File代表它的对象,我如何使用 anIntent在适当的应用程序中打开它?

我尝试的第一件事是:

我确信这在某个时候有效,因为我对其进行了测试并转移到了应用程序的另一部分。现在它总是抛出ActivityNotFoundException. 该文件肯定存在,因为file.exists()返回true并且我知道它是正确的文件,但没有应用程序自愿打开它。

我仍然可以以这种方式打开的唯一文件类型是 .pdf,选择了 Adob​​e Reader,尽管它不是我设备上安装的唯一 PDF 阅读器,也没有设置为默认值。我注意到 Adob​​e Reader 还提供打开在线 pdf 文件的功能(它似乎可以替代使用 Chrome 下载 pdf)。这向我表明,只有 Adob​​e Reader 被认为是匹配的,Intent因为该位置被认为是远程的(尽管不是在线的,因为 Chrome 和其他文件下载应用程序没有被列为替代方案)。

我也尝试过明确说明 MIME 类型:

这会导致Intent匹配到正确的应用程序,但是它们都无法实际打开文件。我已经使用 MIME 类型的硬编码字符串和使用MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension), 传递文件扩展名对此进行了测试。对于各种文件类型,建议了正确的应用程序,但它们都无法打开文件。

编辑:

明确设置 MIME 类型会起作用,但我犯了一个非常愚蠢的错误,我可能应该在答案中解释。

我尝试打开的文件来自互联网,借助DownloadManager. 我使用它的功能在下载完成时显示通知。单击其中一个通知可以完美打开文件。单击完成的通知时,我试图找到Intent触发的源代码DownloadManager,但没有运气。

此外,ES File Explorer 等应用程序可以导航到我的文件下载到的位置并毫无问题地打开它们。我究竟做错了什么?

仅仅是因为不再可能 ACTION_VIEW 外部存储上的文件吗?我的应用程序还临时将文件下载到内部存储,这些文件仍然可以打开,没有以下问题:

至于它在过去的工作,更新 Eclipse、SDK 工具插件和 Android SDK 本身是否会阻止我原来的解决方案工作?