Android 共享目录 不再需要权限实现流程

概述

在Android系统中,为了保护用户的隐私和数据安全,应用程序默认不能直接访问外部存储器上的文件。在Android 4.4之前,开发者需要在AndroidManifest.xml文件中声明读写外部存储器的权限,并且在运行时需要向用户请求授权。但自Android 4.4起,Google引入了存储访问框架(Storage Access Framework,简称SAF),使得应用程序可以通过系统提供的框架来访问外部存储器上的文件,而不再需要申请权限。

实现步骤

下面是实现Android共享目录不再需要权限的步骤:

步骤 描述
1 启动SAF文件选择器
2 处理文件选择结果
3 读写文件

接下来,我们将逐步介绍每个步骤需要做的事情,并给出相应的代码示例。

步骤一:启动SAF文件选择器

SAF文件选择器是Android系统提供的一个界面,用于让用户选择外部存储器上的文件,开发者可以通过调用系统提供的Intent来启动该界面,并指定需要的文件类型。以下是代码示例:

// 创建Intent对象,指定action为ACTION_OPEN_DOCUMENT
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
// 设置文件类型为任意文件
intent.setType("*/*");
// 启动SAF文件选择器
startActivityForResult(intent, REQUEST_CODE);

步骤二:处理文件选择结果

当用户在SAF文件选择器中选择了文件后,Android系统会将选择的文件的URI返回给应用程序。开发者需要在Activity的onActivityResult方法中处理这个返回值,并获取文件的URI。以下是代码示例:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        // 获取选中文件的URI
        Uri uri = data.getData();
        // 处理文件
        handleFile(uri);
    }
}

步骤三:读写文件

在获取到文件的URI后,开发者可以通过ContentResolver来读写文件。以下是代码示例:

private void handleFile(Uri uri) {
    try {
        // 打开文件的输入流
        InputStream inputStream = getContentResolver().openInputStream(uri);
        // 读取文件内容
        // ...
        // 关闭输入流
        inputStream.close();
        
        // 打开文件的输出流
        OutputStream outputStream = getContentResolver().openOutputStream(uri);
        // 写入文件内容
        // ...
        // 关闭输出流
        outputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

以上代码示例中,我们使用了ContentResolver的openInputStream方法和openOutputStream方法来分别打开文件的输入流和输出流,然后可以像操作普通文件一样读取和写入文件内容。

甘特图

下面是使用mermaid语法绘制的甘特图,展示了实现Android共享目录不再需要权限的过程:

gantt
    dateFormat  YYYY-MM-DD
    title 实现Android共享目录不再需要权限
    section 启动SAF文件选择器
    开始  :2022-01-01, 1d
    完成  :2022-01-01, 1d

    section 处理文件选择结果
    开始  :2022-01-02, 1d
    完成  :2022-01-02, 1d
    
    section 读写文件
    开始  :2022-01-03, 1d
    完成  :2022-01-03, 1d

以上是实现Android共享目录不再需要权限的完整流程及相应的代码示例。通过使用SAF文件选择器和ContentResolver,开发者可以方便地实现对外部存储器上文件的读写操作,而无需申请权限。希望这篇文章对刚入行的小白有所帮助。