android数据和文件存储概述翻译
android数据和文件存储概述翻译
Android使用的文件系统类似于其他平台上基于磁盘的文件系统。系统提供了几个选项供您保存应用程序数据:
应用程序特定存储:存储仅用于应用程序的文件,可以位于内部存储卷中的专用目录中,也可以位于外部存储中的不同专用目录中。使用内部存储中的目录保存其他应用程序不应访问的敏感信息。
共享存储:存储应用程序打算与其他应用程序共享的文件,包括媒体、文档和其他文件。
首选项:将私有的原始数据存储在键值对中。
数据库:使用Room持久性库将结构化数据存储在私有数据库中。另一种分类法如下:
共享首选项
将私有原始数据存储在键值对中。
内部存储器
将私有数据存储在设备内存中。
外部存储
将公共数据存储在共享的外部存储上。
SQLite数据库
将结构化数据存储在专用数据库中。
网络连接
使用您自己的网络服务器将数据存储在Web上
下表总结了这些选项的特点:
您选择的解决方案取决于您的特定需求:您的数据需要多少空间?
内部存储空间有限,无法存储应用程序特定的数据。如果需要保存大量数据,请使用其他类型的存储。
数据访问需要多可靠?
如果应用程序的基本功能需要某些数据,例如应用程序启动时,请将数据放置在内部存储目录或数据库中。存储在外部存储中的应用程序特定文件并不总是可访问的,因为某些设备允许用户删除与外部存储相对应的物理设备。
你需要存储什么样的数据?
如果您有只对应用程序有意义的数据,请使用特定于应用程序的存储。对于可共享的媒体内容,请使用共享存储,以便其他应用程序可以访问该内容。对于结构化数据,请使用首选项(对于键值数据)或数据库(对于包含两列以上的数据)。
数据应该是你的应用的私有数据吗?
当存储任何其他应用程序都无法访问的敏感数据时,请使用内部存储、首选项或数据库。内部存储还有一个额外的好处,就是可以对用户隐藏数据。
存储位置的类别
Android提供两种类型的物理存储位置:内部存储和外部存储。在大多数设备上,内部存储比外部存储小。但是,所有设备上都有内部存储,这使得它成为放置应用程序所依赖的数据的更可靠的地方。
可移动卷(如SD卡)作为外部存储的一部分出现在文件系统中。Android使用路径(如/sdcard)表示这些设备。
注意:保存文件的确切位置可能因设备而异。因此,不要使用硬编码文件路径。
默认情况下,应用程序本身存储在内部存储中。但是,如果您的APK 大小非常大,则可以在应用程序的清单文件中指示将应用程序安装到外部存储的首选项:
android:installLocation="preferExternal"> ...
对外部存储的权限和访问:
Android定义了对外部存储器的读写访问权限:读外部存储器和写外部存储器。
在早期版本的Android上,应用程序需要声明这些权限才能访问外部存储上应用程序特定目录之外的任何文件。最新版本的Android更多地依赖于文件的用途,而不是它的位置来决定应用程序访问该文件的能力。这种基于用途的存储模式提高了用户的隐私,因为应用程序只能访问它们实际使用的设备文件系统区域。
范围存储:
为了让用户更好地控制他们的文件并限制文件混乱,默认情况下,针对Android 10(API级别29)及更高版本的应用程序被授予外部存储或范围存储的范围访问权限。此类应用程序只能访问外部存储上的特定于应用程序的目录,以及应用程序创建的特定类型的媒体。
注意:如果应用程序在运行时请求与存储相关的权限,则面向用户的对话框指示应用程序正在请求对外部存储的广泛访问,即使启用了作用域存储。
使用作用域存储,除非您的应用程序需要访问存储在特定于应用程序的目录之外和mediastoreapi可以访问的目录之外的文件。如果将特定于应用程序的文件存储在外部存储上,则可以通过将这些文件放置在外部存储上特定于应用程序的目录中,使采用范围存储更加容易。这样,当启用作用域存储时,应用程序将保持对这些文件的访问。如果您的应用程序有另一个未包含在作用域存储中的用例,请提交功能请求并使用平台提供的应用程序兼容性功能。
操作文件的最佳实践
本节介绍一些从应用程序打开和共享文件的一般最佳实践。
不要重复打开和关闭文件
为了帮助保持应用程序的性能,请不要多次打开和关闭同一文件。对于系统来说,第一次打开文件和读取文件是很昂贵的。
共享单个文件
如果要与其他应用程序共享单个文件或应用程序数据,Android提供以下API:
如果要与其他应用程序共享特定文件,请使用文件提供程序API。
如果要向其他应用程序公开数据,可以使用内容提供商。内容提供商让您完全控制哪些读写访问可用于其他应用程序。尽管可以将内容提供程序用于任何存储介质,但它们通常用于数据库。
查看设备上的文件
要查看存储在设备上的文件,请使用Android Studio的设备文件资源管理器。
额外资源
有关数据存储的更多信息,请参阅以下参考资料。
视频
准备作用域存储(Android Dev Summit'19)
共享存储概述
对其他应用程序可以或应该访问并保存的用户数据使用共享存储,即使用户卸载了您的应用程序。
Android提供了用于存储和访问以下类型可共享数据的API:
媒体内容:系统为这些类型的文件提供标准的公共目录,因此用户对其所有照片有一个公共位置,对其所有音乐和音频文件有另一个公共位置,等等。您的应用程序可以使用平台的MediaStore API访问此内容。
文档和其他文件:系统有一个特殊的目录,用于包含其他文件类型,如PDF文档和使用EPUB格式的书籍。您的应用程序可以使用平台的存储访问框架访问这些文件。
有关这些API的详细信息,请参阅以下指南:
媒体内容
文件和其他文件
媒体内容
从共享存储访问媒体文件
为了提供更丰富的用户体验,许多应用允许用户贡献和访问外部存储卷上可用的媒体。该框架为媒体集合提供了一个优化的索引,称为媒体存储,允许更容易地检索和更新这些媒体文件。即使卸载了应用程序,这些文件仍保留在用户的设备上。
注意:如果你的应用使用的媒体文件只在你的应用中为用户提供价值,最好将它们存储在外部存储中特定于应用的目录中。
要与媒体存储抽象交互,请使用从应用程序上下文中检索的ContentResolver对象:
String[] projection = new String[] {
media-database-columns-to-retrieve
};
String selection = sql-where-clause-with-placeholder-variables;
String[] selectionArgs = new String[] {
values-of-placeholder-variables
};
String sortOrder = sql-order-by-clause;
Cursor cursor = getApplicationContext().getContentResolver().query( MediaStore.media-type.Media.EXTERNAL_CONTENT_URI,
projection,
selection,
selectionArgs,
sortOrder
);
while (cursor.moveToNext()) {
// Use an ID column from the projection to get
// a URI representing the media item itself.
}
系统会自动扫描外部存储卷,并将媒体文件添加到以下定义良好的集合中
图片,包括照片和截图,它们存储在DCIM/和Pictures/目录中。系统将这些文件添加到MediaStore.图像桌子。
视频,存储在DCIM/、Movies/和Pictures/目录中。系统将这些文件添加到MediaStore.视频桌子。
存储在Alarms/、Audiobooks/、Music/、Notifications/、Podcast/和铃声/目录中的音频文件,以及存储在Music/或Movies/目录中的音频播放列表。系统将这些文件添加到MediaStore.音频桌子。
下载的文件,存储在Download/目录中。在运行Android10(API级别29)及更高版本的设备上,这些文件存储在MediaStore.下载桌子。此表在Android 9(API级别28)及更低版本上不可用。
媒体商店还包括一个名为MediaStore.Files文件. 它的内容取决于您的应用程序是否使用范围存储,该存储可用于针对Android 10或更
高版本的应用程序:
如果启用了作用域存储,则集合仅显示应用程序创建的照片、视频和音频文件。
如果作用域存储不可用或未使用,则集合将显示所有类型的媒体文件。请求必要的权限
在对媒体文件执行操作之前,请确保您的应用已声明访问这些文件所需的权限。但是,请记住,你的应用不应该声明它不需要或使用的权限。
存储权限
访问应用程序中媒体文件的权限模型取决于应用程序是否使用针对Android 10或更高版本的应用程序提供的作用域存储。
已启用作用域存储
如果你的应用程序使用范围存储,它应该只为运行Android9(API级别28)或更低版本的设备请求与存储相关的权限。您可以通过添加android:maxSdkVersion属性应用程序清单文件中的权限声明:
android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> 对于运行Android10或更高版本的设备,不要不必要地请求与存储相关的权限。您的应用程序可以为定义良好的媒体集合做出贡献,包括MediaStore.下载集合,而不请求任何与存储相关的权限。例如,如 果您正在开发照相机应用程序,则不需要请求与存储相关的权限,因 为您的应用程序拥有要写入媒体存储的图像。 要访问其他应用程序创建的文件,必须满足以下条件: 您的应用程序已被授予读取外部存储权限。 文件位于下列定义良好的媒体集合之一: MediaStore.图像 MediaStore.视频 MediaStore.音频 特别是,如果你的应用想要访问MediaStore.下载应用程序未创建的集合,必须使用存储访问框架。若要了解有关如何使用此框架的详细信息,请参阅有关如何访问文档和其他文件的指南。 作用域存储不可用 如果您的应用程序在运行Android 9或更低版本的设备上使用,或者如果您的应用程序正在使用存储兼容性功能,则必须请求“读取外部存储”权限才能访问媒体文件。如果要修改媒体文件,还必须请求“写入外部存储”权限。 注意:如果你的应用的用例不在范围存储中,请提交一个功能请求并使用平台提供的应用兼容性功能。