Android 11 SAF (Storage Access Framework) 获取相册
引言
在 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 获取相册中图片的步骤:
- 请求读取存储权限:在 AndroidManifest.xml 文件中添加以下权限申请:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- 弹出文件选择器:使用 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);
}
- 处理文件选择结果:在 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();
}
}
}
}
- 读取图片数据:通过 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 语法展示了代码的执行流程,以及使用了饼状图展示了数据的分布情况。