Android 11 SAF (Storage Access Framework) 获取相册

Android 11 SAF


引言

在 Android 11 中,Google 引入了新的存储权限模型,称为 SAF (Storage Access Framework)。这个新模型意味着应用程序不再能够直接访问用户的文件系统,而是需要使用 SAF API 来访问用户的文件。

本文将介绍如何使用 SAF API 获取相册中的图片,并提供相应的代码示例。我们将在文章中使用 Mermaid 语法来展示代码的执行流程,并使用饼状图来展示数据分布。


什么是 SAF?

SAF (Storage Access Framework) 是 Android 提供的一组 API,用于访问用户的存储空间。在 Android 11 中,应用程序不能直接访问用户的文件系统,而是需要通过 SAF API 来进行操作。

SAF API 提供了一种标准的方式来选择文件和目录,以及进行读取和写入操作。它可以帮助应用程序提供更安全和更一致的文件访问体验。


如何使用 SAF 获取相册中的图片

以下是使用 SAF API 获取相册中图片的步骤:

  1. 请求读取存储权限:在 AndroidManifest.xml 文件中添加以下权限申请:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  1. 弹出文件选择器:使用 Intent.ACTION_OPEN_DOCUMENT 和 Intent.CATEGORY_OPENABLE 启动文件选择器,并指定 MIME 类型为 "image/*"。
private static final int REQUEST_CODE_OPEN_DOCUMENT = 1;

private void selectImage() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("image/*");
    startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT);
}
  1. 处理文件选择结果:在 onActivityResult 方法中获取选中的图片 URI,并使用 ContentResolver 进行读取操作。
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_CODE_OPEN_DOCUMENT && resultCode == RESULT_OK) {
        if (data != null) {
            Uri uri = data.getData();
            try {
                InputStream inputStream = getContentResolver().openInputStream(uri);
                // 在这里读取图片数据
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}
  1. 读取图片数据:通过 InputStream 可以读取到选中图片的内容。
private byte[] readImageData(InputStream inputStream) throws IOException {
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();

    byte[] buffer = new byte[4096];
    int bytesRead;
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        byteStream.write(buffer, 0, bytesRead);
    }

    return byteStream.toByteArray();
}

使用 Mermaid 语法展示代码执行流程

以下是使用 Mermaid 语法展示代码执行流程的示例:

journey
    title SAF 获取相册中的图片

    section 请求读取存储权限
    AndroidManifest.xml -> SAF API: 添加权限申请

    section 弹出文件选择器
    SAF API -> Intent: 启动文件选择器
    Intent -> 文件选择器: 弹出文件选择器界面

    section 处理文件选择结果
    文件选择器 -> SAF API: 返回选中图片的 URI
    SAF API -> 应用程序: 回调 onActivityResult 方法

    section 读取图片数据
    应用程序 -> ContentResolver: 打开选中图片的输入流
    ContentResolver -> SAF API: 返回图片输入流
    SAF API -> 应用程序: 读取图片数据

使用饼状图展示数据分布

以下是使用饼状图展示数据分布的示例:

pie
    title 图片格式分布

    "JPEG" : 70
    "PNG" : 20
    "GIF" : 10

饼状图展示了图片格式的分布情况,其中 JPEG 占据了 70%,PNG 占据了 20%,GIF 占据了 10%。


总结

本文介绍了在 Android 11 中使用 SAF API 获取相册中的图片的步骤,并提供了相应的代码示例。我们使用了 Mermaid 语法展示了代码的执行流程,以及使用了饼状图展示了数据的分布情况。