Android 11 中的 setDestinationInExternalPublicDir
在 Android 11 中,Google 引入了一种新的存储访问机制,称为“分区存储”(Scoped Storage)。分区存储的主要目的是限制应用程序对设备存储的访问,以提高用户隐私和安全性。在这种情况下,应用程序不能随意访问存储在外部存储上的文件。
但是,有时我们需要将文件保存到外部存储的公共目录中,以便其他应用程序可以访问它们。在这种情况下,我们可以使用 setDestinationInExternalPublicDir
方法。
什么是 setDestinationInExternalPublicDir?
setDestinationInExternalPublicDir
是一个用于将文件保存到外部存储的公共目录的方法。这个方法接受一个目录名作为参数,并返回一个 Uri
对象,该对象表示保存的文件的位置。
使用 setDestinationInExternalPublicDir
以下是如何使用 setDestinationInExternalPublicDir
的示例代码:
// 获取 MediaStore 的内容提供者
ContentResolver contentResolver = getContentResolver();
// 创建一个 ContentValues 对象,用于存储文件的元数据
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "example.jpg");
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg");
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);
// 使用 setDestinationInExternalPublicDir 方法保存文件
ContentResolver resolver = getContentResolver();
Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
// 获取文件的输出流
OutputStream outputStream = resolver.openOutputStream(imageUri);
// 将文件内容写入输出流
byte[] buffer = new byte[1024];
int bytesRead;
try (InputStream inputStream = new FileInputStream("path/to/source/image.jpg")) {
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
// 刷新并关闭输出流
outputStream.flush();
outputStream.close();
在上面的代码中,我们首先获取 ContentResolver
对象,然后创建一个 ContentValues
对象,用于存储文件的元数据。接下来,我们使用 setDestinationInExternalPublicDir
方法将文件保存到外部存储的公共目录中。
甘特图
以下是实现 setDestinationInExternalPublicDir
方法的步骤的甘特图:
gantt
title 实现 setDestinationInExternalPublicDir 方法的步骤
dateFormat YYYY-MM-DD
section 步骤 1: 获取 ContentResolver
获取 ContentResolver :done, des1, 2023-02-01,2023-02-02
section 步骤 2: 创建 ContentValues 对象
创建 ContentValues 对象 :active, des2, 2023-02-03, 3d
section 步骤 3: 使用 setDestinationInExternalPublicDir 方法保存文件
使用 setDestinationInExternalPublicDir 方法保存文件 :after des2, 5d
section 步骤 4: 获取文件的输出流
获取文件的输出流 : 2023-02-09, 2023-02-10
section 步骤 5: 将文件内容写入输出流
将文件内容写入输出流 : 2023-02-11, 2023-02-12
section 步骤 6: 刷新并关闭输出流
刷新并关闭输出流 : 2023-02-13, 2023-02-14
结论
在 Android 11 中,使用 setDestinationInExternalPublicDir
方法可以方便地将文件保存到外部存储的公共目录中。这种方法不仅可以提高应用程序的灵活性,还可以确保应用程序遵守分区存储的要求。通过遵循上述步骤,您可以轻松地实现这一功能,并确保您的应用程序在 Android 11 上正常运行。