单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,SAF,2025/3/20,12,2025/3/20,认识,SAF,DocumentsProvider,目录,CONTENT,1,2,文件检索,3,参考教材,:Android,应用开发项目化教程,认识,SAF,来源,SAF,(存储访问框架:,Storage,AccessFramework,),是,Android4.4,(,API19,级)引入的功能SAF,让用户能够在其所有首选文档存储提供程序中方便地浏览并打开文档、图像以及其他文件用户可以通过易用的标准,UI,,以统一方式在所有应用和提供程序中浏览文件和访问最近使用的文件1,认识,SAF,组成,文档提供程序,:,一种内容提供程序,允许存储服务(如Google云端硬盘)显示其管理的文件文档提供程序作为DocumentsProvider类的子类实现文档提供程序的架构基于传统文件层次结构,但其实际数据存储方式由您决定Android平台包括若干内置文档提供程序,如Downloads、Images和Videos;,客户端应用,:,一种自定义应用,它调用ACTION_OPEN_DOCUMENT和ACTION_,CREATE_DOCUMENTIntent并接收文档提供程序返回的文件;,选取器,:,一种系统UI,允许用户访问所有满足客户端应用搜索条件的文档提供程序内的文档。
1,认识,SAF,主要功能,允许用户浏览所有文档提供程序而不仅仅是单个应用中的内容,让应用获得对文档提供程序所拥有文档的长期、持久性访问权限用户可以通过此访问权限添加、编辑、保存和删除提供程序上的文件,支持多个用户帐户和临时根目录1,DocumentsProvider,认识,DocumentsProvider,DocumentsProvider:一个特殊的ContentProvider,让一个存储服务可以对外展示自己所管理的文件数据结构:文件目录层次,2,DocumentsProvider,认识,DocumentsProvider,特性,每个文档提供程序都会报告一个或多个作为探索文档结构树起点的,“,根目录,”,每个根目录都有一个唯一的,COLUMN_ROOT_ID,,并且指向表示该根目录下内容的文档(目录)根目录采用动态设计,以支持多个帐户、临时,USB,存储设备或用户登录,/,注销等用例;,每个根目录下都有一个文档该文档指向,1,至,N,个文档,而其中每个文档又可指向,1,至,N,个文档;,每个存储后端都会通过使用唯一的,COLUMN_DOCUMENT_ID,引用各个文件和目录来显示它们。
文档,ID,必须具有唯一性,一旦发放便不得更改,因为它们用于所有设备重启过程中的永久性,URI,授权;,2,DocumentsProvider,认识,DocumentsProvider,特性,文档可以是可打开的文件(具有特定,MIME,类型)或包含附加文档的目录(具有,MIME_TYPE_DIR MIME,类型);,每个文档都可以具有不同的功能,如,COLUMN_FLAGS,所述例如,,FLAG_SUPPORTS _WRITE,、,FLAG_SUPPORTS_DELETE,和,FLAG_SUPPORTS_THUMBNAIL,多个目录中可以包含相同的,COLUMN_DOCUMENT_ID,2,DocumentsProvider,控制流,2,DocumentsProvider,控制流,注意事项,在,SAF,中,提供程序和客户端并不直接交互客户端请求与文件交互(即读取、编辑、创建或删除文件)的权限;,交互在应用触发,Intent ACTION_OPEN_DOCUMENT,或,ACTION_CREATE_DOCUMENT,后开始Intent,可能包括进一步细化条件的过滤器;,Intent,触发后,系统选取器将检索每个已注册的提供程序,并向用户显示匹配的内容根目录;,选取器会为用户提供一个标准的文档访问界面,但底层文档提供程序可能与其差异很大。
2,文件检索,编写客户端应用,设置,Intent,的,Action,Android 4.3,及更低版本,ACTION_PICK,ACTION_GET_CONTENT,Android 4.4,及更高版本,ACTION_OPEN_DOCUMENT,(显示一个由系统控制的选取器,UI,),3,文件检索,编写客户端应用,搜索文档,当应用触发 ACTION_OPEN_DOCUMENT Intent 时,后者会启动一个选取器来显示所有匹配的文档提供程序,在 Intent 中添加类别 CATEGORY_,OPENABLE 可对结果进行过滤,以仅显示可以打开的文档(如图像文件),语句 intent.setType(image/*)可做进一步过滤,以仅显示 MIME 数据类型为图像的文档,3,文件检索,编写客户端应用,处理结果,3,文件检索,编写客户端应用,检查文档元数据,3,文件检索,编写客户端应用,打开文档,位图,3,文件检索,编写客户端应用,打开文档,获取 InputStream,3,文件检索,编写客户端应用,创建新文档,ACTION_CREATE_DOCUMENT,创建新文档后,即可在,onActivityResult(),中获取其,URI,,以便继续向其写入内容。
3,文件检索,编写客户端应用,删除文档,如果获得了文档的 URI,并且文档的 Document.COLUMN_FLAGS 包含 SUPPORTS,_DELETE,便可以删除该文档3,文件检索,编写客户端应用,编辑文档,触发 ACTION_OPEN_DOCUMENT Intent 并使用类别 CATEGORY_OPENABLE 以仅显示可以打开的文档3,文件检索,编写客户端应用,编辑文档,从 onActivityResult()调用代码以执行编辑3,文件检索,自定义文档提供程序,参见,。