Android 11 将 Bitmap 保存到 SD 卡的指南

在 Android 11 中,Google 对存储权限做出了重大更改,特别是对于如何访问外部存储(如 SD 卡)。这意味着如果你的应用想要保存 Bitmap 文件到 SD 卡,你需要使用新的 API,遵循新的权限管理规定。本文将为你介绍如何在 Android 11 中将 Bitmap 保存到 SD 卡,并提供代码示例。

1. 使用 Storage Access Framework

在 Android 10 及以上版本中,建议使用 Storage Access Framework。通过此框架,用户可以选择文件存储位置。你可以使用 Intent 启动选择文件的界面。以下是使用 Storage Access Framework 的步骤。

1.1. 请求权限

在 Android 11 中,申请存储权限的代码如下:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
}

这里,REQUEST_CODE 是你设定的请求代码。

1.2. 启动文件选择器

通过以下代码启动文件选择器,用户可以选择存储位置:

Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/png");
intent.putExtra(Intent.EXTRA_TITLE, "my_image.png");
startActivityForResult(intent, CREATE_FILE);

1.3. 处理选择结果

当用户选择了存储位置后,你可以在 onActivityResult 方法中处理:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    
    if (requestCode == CREATE_FILE && resultCode == Activity.RESULT_OK) {
        Uri uri = data.getData();
        saveBitmapToUri(myBitmap, uri);
    }
}

1.4. 保存 Bitmap 到指定 URI

接下来,你可以使用以下代码将 Bitmap 保存到用户选定的 URI:

private void saveBitmapToUri(Bitmap bitmap, Uri uri) {
    try {
        OutputStream outputStream = getContentResolver().openOutputStream(uri);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
        outputStream.flush();
        outputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这段代码用于打开输出流,并将 Bitmap 数据写入到指定的 URI 中。

2. 注意事项

注意事项 描述
权限管理 Android 11 要求动态管理权限
使用 Storage Access Framework 始终使用 SAF 进行文件操作
Bitmap 格式 可以选择 PNG、JPEG 等格式
关闭输出流 在写入图像后务必要关闭输出流

结论

在 Android 11 中,将 Bitmap 保存到 SD 卡稍微复杂,但通过使用 Storage Access Framework,开发者可以有效地实现此功能。通过请求必要的权限、启动文件选择器以及保存 Bitmap 到用户选择的位置,你的应用将更符合 Android 的存储政策。

希望本文对你理解 Android 11 中如何处理 Bitmap 保存有所帮助。如果你有任何问题或需要进一步讨论,请随时联系我!