android saf 打开指定目录,并操作相关文件

android saf 打开指定目录,并操作相关文件

saf存储访问框架(android 4.4 引入)全称 Storage Access Framework
用户可轻松在其所有首选文档存储提供程序中浏览并打开文档、图像及其他文件。
用户可通过易用的标准界面,以统一方式在所有应用和提供程序中浏览文件,以及访问最近使用的文件。
我们可以通过ACTION_OPEN_DOCUMENT或ACTION_OPEN_DOCUMENT_TREE来选择文件或文件夹,获得对应的URI(在Android系统中的地址)
通过URI与DocumentFile工具类来进行添加、编辑、保存和删除的操作

打开指定目录文件有两种方式

第一种使用(要求api level 19) ACTION_OPEN_DOCUMENT

使用方法:选择文件   (ACTION_CREATE_DOCUMENT 创建文件)
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);//必须
        intent.setType("*/*");//必须
        intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri);
        startActivityForResult(intent, WRITE_REQUEST_CODE);
  其中 uri:
        Uri uri = Uri.parse("content://com.android.externalstorage.documents/document/primary:test");
        固定格式:content://com.android.externalstorage.documents/document/primary
        :test 代表下面的test 文件夹,当然如果再想得到下一级文件夹还需要:既 :test:child

第二种方法(要求api level 21)ACTION_OPEN_DOCUMENT_TREE

使用方法:选择文件夹
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
        //intent.putExtra("android.content.extra.SHOW_ADVANCED", true);
        intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri);
        startActivityForResult(intent, WRITE_REQUEST_CODE);
 其中uri 和第一种一样

操作返回的文件夹命令(使用第二种方法)

 借助 implementation "androidx.documentfile:documentfile:1.0.1"
 @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         if (data == null || resultCode != Activity.RESULT_OK) return;
        if (requestCode == WRITE_REQUEST_CODE) {
             DocumentFile child = DocumentFile
                     .fromTreeUri(this, data.getData())
                     .createDirectory("child")
                     .createFile("text/plain", "text.txt");
             Uri uri = child.getUri();
             try {
                 getContentResolver().openOutputStream(uri).write("成功".getBytes());
             } catch (FileNotFoundException e) {
                 e.printStackTrace();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     }
Android 中,可以使用 SAF(Storage Access Framework)读写文件SAF 可以让用户选择他们想要使用的文件浏览器应用来访问文件系统。以下是一个简单的示例代码: 1. 读取文件: ``` private static final int READ_REQUEST_CODE = 42; public void performFileSearch() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); startActivityForResult(intent, READ_REQUEST_CODE); } @Override public void onActivityResult(int requestCode, int resultCode, Intent resultData) { if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) { Uri uri = null; if (resultData != null) { uri = resultData.getData(); try { InputStream inputStream = getContentResolver().openInputStream(uri); // 读取输入流中的数据 inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 2. 写入文件: ``` private static final int WRITE_REQUEST_CODE = 43; public void performFileSave() { Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_TITLE, "my_file.txt"); startActivityForResult(intent, WRITE_REQUEST_CODE); } @Override public void onActivityResult(int requestCode, int resultCode, Intent resultData) { if (requestCode == WRITE_REQUEST_CODE && resultCode == Activity.RESULT_OK) { Uri uri = null; if (resultData != null) { uri = resultData.getData(); try { OutputStream outputStream = getContentResolver().openOutputStream(uri); // 写入数据到输出流中 outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 在这两个示例代码中,我们使用 Intent.ACTION_OPEN_DOCUMENT 和 Intent.ACTION_CREATE_DOCUMENT 来启动 SAF。在 onActivityResult 方法中,我们可以获取到用户选择的文件的 Uri,并且可以通过 getContentResolver().openInputStream 和 getContentResolver().openOutputStream 来读取和写入数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值