目录

Android开发之数据和文件存储

目录

http://image.catbro.cn/upload_88e168a529af9a66cde8d01ac0341391.png

更多分享:http://www.catbro.cn

简介

Android uses a file system that’s similar to disk-based file systems on other platforms. The system provides several options for you to save your app data:

Android使用的文件系统类似于其他平台上基于磁盘的文件系统。系统为您提供了一些保存应用数据的选项:

1、App-specific storage(特定于应用程序的存储):

  • Store files that are meant for your app’s use only, either in dedicated directories within an internal storage volume or different dedicated directories within external storage. Use the directories within internal storage to save sensitive information that other apps shouldn’t access.

  • 将仅供您的应用程序使用的文件存储在内部存储卷内的专用目录中或外部存储中的其他专用目录中。 使用内部存储中的目录来保存其他应用程序不应访问的敏感信息。

2、Shared storage(共享存储):

  • Store files that your app intends to share with other apps, including media, documents, and other files.

  • 共享存储:存储app计划与其它应用分享的文件,包括媒体数据、文档和其他的文件

3、Preferences(偏好文件存储):

  • Store private, primitive data in key-value pairs.

  • 存储私有,原始的键值对数据

4、Databases(数据库):

  • Store structured data in a private database using the Room persistence library.

  • 使用Room持久性库将结构化的数据存储在私有的数据库中

下表总结了以上不同存储类型的特征:

类型 内容类型 获取方法 权限 其它应用获取? app卸载时是否移除 备注
应用程序特定文件存储 仅自己的应用可以使用 1、内部存储:getFilesDir() 或 getCacheDir(); 2、外部存储: getExternalFilesDir() 或者 getExternalCacheDir() 1、内部存储不需要申请权限;2、 在运行Android 4.4(API级别19)或更高版本的设备上使用您的应用程序时,无需外部存储 1、内部存储:存储在内部存储目录中,不可获取;2、外部存储:存储在外部目录中,可获取
媒体 分享媒体文件 (images, audio files, videos) MediaStore API 1、在Android 10版本或更高时需要READ_EXTERNAL_STORAGE 或者 WRITE_EXTERNAL_STORAGE; 2、在Android9以下时两者都需要申请 可以,但其它应用需要获取READ_EXTERNAL_STORAGE权限
文档或者其它文件 其他类型的可共享内容,包括下载的文件 存储访问框架 不需要 可以, 是的,通过系统文件选择器
应用 preferences key-value键值对 Jetpack首选项库 不需要
数据库 结构化数据 Room持久库 不需要

方案选择

根据特定的需求选择的合适的方案:

1、数据空间需要多少?

  • 对于特定的应用数据,内部存储空间有限。如果需要存储大量的数据,请使用其它的存储方案

2、数据访问需要多可靠?

  • 如果你的app基本功能需要某些数据,例如在app启动的时候用到的数据,请存储在内部存储或者数据库中。外部存储中的文件不能保证任何时候都能访问到,因为一些设备允许用户去移除与外部存储关联的物理设备。

3、你需要存储哪种数据?

  • 如果你的数据只对你的app有意义,建议使用应用程序特定文件存储。对于可分享的媒体内容,使用分享存储以便其它的应用可以访问这些内容。对于结构化数据,使用preferences或者数据库存储。

4、数据对于你的app是否是私有的?

  • 使用内部存储、preferences、数据库存储可以让敏感的数据不被其它应用访问到。内部存储的另外一个好处是对用户隐藏了数据。

本地存储分类

Android provides two types of physical storage locations: internal storage and external storage. On most devices, internal storage is smaller than external storage. However, internal storage is always available on all devices, making it a more reliable place to put data on which your app depends.

安卓提供了两种本地物理存储类型:内部存储和外部存储。在大多数设备上,内部存储小雨外部存储。然而,内部存储对于所有的设备来说总是可访问的,这使它成为了防止应用程序依赖的数据更可靠的地方。

Removable volumes, such as an SD card, appear in the file system as part of external storage. Android represents these devices using a path, such as /sdcard.

可移动的卷轴,例如sd卡作为外部存储的一部分出现在文件系统中。Android使用路径(例如/sdcard)表示这些设备。

注意:保存文件的确切位置可能会因设备而异。因此,请勿使用硬编码的文件路径。

Apps themselves are stored within internal storage by default. If your APK size is very large, however, you can indicate a preference within your app’s manifest file to install your app on external storage instead:

应用程序默认情况下存储在内部存储中。但是,如果你的APK大小非常大,则可以在应用的清淡文件中指定一个偏好设置以将应用程序安装在外部存储设备上:

1
2
3
4
<manifest ...
  android:installLocation="preferExternal">
  ...
</manifest>

权限和获取外部存储

Android defines the following permissions for read-and-write access to external storage: READ_EXTERNAL_STORAGE and WRITE_EXTERNAL_STORAGE.

对于读写外部存储,安卓定义了以下权限:

  • READ_EXTERNAL_STORAGE
  • WRITE_EXTERNAL_STORAGE.

On earlier versions of Android, apps needed to declare these permissions to access any file outside the app-specific directories on external storage. More recent versions of Android rely more on a file’s purpose than its location for determining an app’s ability to access that file. This purpose-based storage model improves user privacy because apps are given access only to the areas of the device’s file system that they actually use.

在早期的Android版本上,应用程序需要描述这些权限去获取应用程序特性文件目录以外的外部存储中的文件。较新版本的Android在确定用用程序访问文件能力时,更多的取决于文件的用途而非位置。这种基于目的的存储模型改善了用户隐私,因为仅授予应用访问他们实际使用的设备文件系统区域的权限

范围存储

To give users more control over their files and to limit file clutter, apps that target Android 10 (API level 29) and higher are given scoped access into external storage, or scoped storage, by default. Such apps have access only to the app-specific directory on external storage, as well as specific types of media that the app has created.

为了让用户更好地去控制文件和限制文件的混乱,默认地,应用程序在Android 10以上的版本中运行时具有对外部存储或则反问存储的范围内访问能力。此类应用只能访问外部存储上特定于应用的目录以及该应用创建的特定媒体类型。

注意:如果您的应用在运行时请求与存储相关的权限,则即使启用了作用域存储,面向用户的对话框也将指示您的应用正在请求对外部存储的广泛访问。

Use scoped storage unless your app needs access to a file that’s stored outside of an app-specific directory and outside of a directory that the MediaStore APIs can access. If you store app-specific files on external storage, you can make it easier to adopt scoped storage by placing these files in an app-specific directory on external storage. That way, your app maintains access to these files when scoped storage is enabled.

除非您的应用需要访问存储在应用特定目录之外以及MediaStore API可以访问的目录之外的文件,否则请使用范围存储。 如果将特定于应用程序的文件存储在外部存储中,则可以通过将这些文件放置在外部存储上的特定于应用程序的目录中,从而更容易采用作用域存储。 这样,启用范围存储后,您的应用程序便可以访问这些文件。

If your app has another use case that isn’t covered by scoped storage, file a feature request and use the app compatibility feature that the platform provides.

如果您的应用具有范围存储不涉及的另一个用例,请提出功能请求并使用平台提供的应用兼容性功能。


处理文件的最佳做法

本节介绍了一些用于从应用中打开和共享文件的常规最佳做法

1、不要重复打开和关闭文件

  • 为了帮助维持应用程序的性能,请勿多次打开和关闭同一文件。对于系统来说,第一次打开文件并读取文件的成本很高。

2、共享单个文件

如果要与其他应用程序共享单个文件或应用程序数据,Android提供以下API:

  • 如果要与其他应用程序共享特定文件,请使用FileProvider API。

  • 如果要将数据公开给其他应用程序,则可以使用内容提供程序。 内容提供商可让您完全控制其他应用程序可以使用的读写访问权限。 尽管您可以将内容提供程序与任何存储介质一起使用,但它们最常与数据库一起使用。


查看设备上的文件

  • 要查看存储在设备上的文件,请使用Android Studio的设备文件资源管理器。

额外资源