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 上正常运行。