1、
简介:Android的文件存储框架(Storage Access Framework,简称SAF)是在Android 4.4(API级别19)引入的一种机制,旨在简化用户在多个文档提供程序之间浏览和访问文件的过程,它通过一个统一的界面,让用户可以方便地从各种存储服务中选择和管理文件。
组成:SAF主要由三部分组成:文档提供程序、客户端应用和选择器,文档提供程序是一个Content Provider,负责管理文件并提供访问接口;客户端应用是调用SAF功能的应用;选择器是一个系统界面,用于展示可供用户选择的文件列表。
优势:SAF提供了一种统一的方式来访问文件,无论是本地存储还是云存储服务,用户都可以通过相同的界面进行操作,SAF还支持多用户账户和临时根目录,提高了系统的灵活性和安全性。
2、文档提供程序
定义:文档提供程序是一个Content Provider,继承自DocumentsProvider类,用于管理和提供文件访问接口,它可以封装不同的存储服务,如本地存储或云存储。
架构:文档提供程序的数据结构基于传统的文件层次结构,每个提供程序有一个或多个Root节点,每个Root节点下有若干文档,这些文档可以是文件或文件夹,具有唯一的COLUMN_DOCUMENT_ID来标识。
实现:开发者需要创建一个继承自DocumentsProvider的类,并实现必要的方法,如query()、insert()、update()和delete()等,通过这些方法,客户端应用可以对文件进行增删改查操作。
示例:以下是一个简单文档提供程序的代码示例:
public class MyDocumentsProvider extends DocumentsProvider { @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // 实现查询逻辑 return null; } @Override public Uri insert(Uri uri, ContentValues values) { // 实现插入逻辑 return null; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // 实现更新逻辑 return 0; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // 实现删除逻辑 return 0; } }
3、客户端应用
使用方式:客户端应用通过调用ACTION_OPEN_DOCUMENT或ACTION_CREATE_DOCUMENT等Intent来启动SAF选择器,从而让用户选择文件,选择完成后,客户端应用会收到一个包含所选文件URI的结果。
打开文件:以下是一个打开文件的示例代码:
private static final int READ_REQUEST_CODE = 42; public void openFile() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(intent, READ_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, resultCode, Intent data) { if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) { if (data != null) { Uri uri = data.getData(); // 处理文件URI } } }
创建文件:以下是一个创建文件的示例代码:
private static final int WRITE_REQUEST_CODE = 43; public void createFile() { Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TITLE, "example.txt"); startActivityForResult(intent, WRITE_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, resultCode, Intent data) { if (requestCode == WRITE_REQUEST_CODE && resultCode == Activity.RESULT_OK) { if (data != null) { Uri uri = data.getData(); // 处理新创建的文件URI } } }
4、选择器
作用:选择器是一种系统界面,允许用户从所有已注册的文档提供程序中选择文件,选择器会根据客户端应用传递的Intent参数显示符合条件的文件列表。
使用方式:客户端应用通过启动一个带有ACTION_OPEN_DOCUMENT或ACTION_CREATE_DOCUMENT等Action的Intent来触发选择器,选择器会自动处理文件的选择过程,并在用户完成选择后将结果返回给客户端应用。
示例:以下是一个使用选择器的示例代码:
private void openFilePicker() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); startActivityForResult(intent, PICK_FILE); } @Override protected void onActivityResult(int requestCode, resultCode, Intent data) { if (requestCode == PICK_FILE && resultCode == Activity.RESULT_OK) { if (data != null) { Uri uri = data.getData(); // 处理选择的文件URI } } }
相关问题与解答
问题1:如何在Android中使用SAF打开文件?
答:在Android中使用SAF打开文件的步骤如下:
1、创建一个Intent,设置Action为Intent.ACTION_OPEN_DOCUMENT。
2、根据需要添加Category和Type,例如Intent.CATEGORY_OPENABLE和"image/*"。
3、使用startActivityForResult()方法启动Intent。
4、在onActivityResult()方法中处理返回的结果,获取选中的文件URI。
示例代码如下:
private static final int READ_REQUEST_CODE = 42; public void openFile() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(intent, READ_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, resultCode, Intent data) { if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) { if (data != null) { Uri uri = data.getData(); // 处理文件URI } } }
问题2:如何在Android中使用SAF创建文件?
答:在Android中使用SAF创建文件的步骤如下:
1、创建一个Intent,设置Action为Intent.ACTION_CREATE_DOCUMENT。
2、根据需要添加Category和Type,例如Intent.CATEGORY_OPENABLE和"text/plain"。
3、使用putExtra()方法设置文件的标题。
4、使用startActivityForResult()方法启动Intent。
5、在onActivityResult()方法中处理返回的结果,获取新创建的文件URI。
示例代码如下:
private static final int WRITE_REQUEST_CODE = 43; public void createFile() { Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TITLE, "example.txt"); startActivityForResult(intent, WRITE_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, resultCode, Intent data) { if (requestCode == WRITE_REQUEST_CODE && resultCode == Activity.RESULT_OK) { if (data != null) { Uri uri = data.getData(); // 处理新创建的文件URI } } }
到此,以上就是小编对于“android文件存储框架”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/627731.html