存储访问框架(Storage Access Framework,简称SAF)
存储访问框架(SAF)是Android系统提供的一种用于访问非应用本身专属文件的机制,它允许用户在其所有首选文档存储提供程序中方便地浏览并打开文档、图像以及其他文件,通过易用的标准UI,用户可以统一方式在所有应用和提供程序中浏览文件和访问最近使用的文件。
1、文档提供程序:作为ContentProvider的子类,文档提供程序允许存储服务显示其管理的文件,文档提供程序的架构基于传统文件层次结构,Android平台包括若干内置文档提供程序,如ExternalStorageProvider。
2、客户端应用:即我们平时使用的app,它通过调用ACTION_OPEN_DOCUMENT、ACTION_CREATE_DOCUMENT等Intent的Action来实现打开、创建文档以及打开文档树等功能。
3、选取器:一种系统UI,称为DocumentUi,允许用户访问所有满足客户端应用搜索条件的文档提供程序内的文档,这个DocumentUI无桌面图标和入口,只能通过Intent访问。
1、打开文件:客户端应用通过启动一个带有ACTION_OPEN_DOCUMENT Intent的Activity来请求打开某个文件,用户选择一个文件后,所选文件的URI会通过Intent返回给客户端应用。
2、打开文件树:客户端应用可以通过启动一个带有ACTION_OPEN_DOCUMENT_TREE Intent的Activity来请求访问某个目录下的所有文件,用户选择一个目录后,所选目录的URI会通过Intent返回给客户端应用。
3、创建文件:客户端应用可以通过启动一个带有ACTION_CREATE_DOCUMENT Intent的Activity来请求创建一个新的文件,用户输入文件名并选择一个位置后,新创建的文件的URI会通过Intent返回给客户端应用。
以下是一个简单的示例,展示了如何在Android应用中使用SAF打开一个文件:
public class SAFDemoActivity extends AppCompatActivity { private static final int READ_REQUEST_CODE = 42; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_saf_demo); findViewById(R.id.open_file_button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { performFileSearch(); } }); } public void performFileSearch() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); // 可以根据需要设置具体的MIME类型 startActivityForResult(intent, READ_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent resultData) { if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) { if (resultData != null) { Uri uri = resultData.getData(); Log.i(TAG, "Uri: " + uri.toString()); // 在这里可以使用uri进行后续的文件操作,如读取文件内容等 } } } }
在上述示例中,当用户点击“打开文件”按钮时,会弹出一个文件选择器,用户可以在其中选择一个文件,选择文件后,所选文件的URI会通过Intent返回给应用,并在日志中打印出来。
1、问:SAF的主要作用是什么?
答:SAF的主要作用是提供一个统一的接口,让用户能够在其所有首选文档存储提供程序中方便地浏览并打开文档、图像以及其他文件,它简化了文件访问的流程,提高了用户在不同应用间共享和访问文件的便利性。
2、问:如何实现自定义文档提供程序?
答:要实现自定义文档提供程序,需要在应用的清单文件中添加一个<provider>元素来声明自定义存储空间提供商,并将属性android:name设置为自定义的DocumentsProvider子类的全限定名,还需要实现相应的协定类,如DocumentsContract.Document和DocumentsContract.Root。
存储访问框架(SAF)为Android开发者提供了一个强大而灵活的工具,用于访问和管理设备上的文件,通过使用SAF,开发者可以为用户提供更加流畅和便捷的文件访问体验,同时确保应用的安全性和稳定性,随着移动设备的普及和云存储技术的发展,SAF的应用前景将更加广阔。