Android 11 WRITE_EXTERNAL_STORAGE

介绍

在Android 11中,WRITE_EXTERNAL_STORAGE权限的行为发生了一些变化。WRITE_EXTERNAL_STORAGE权限用于向外部存储(如SD卡)写入数据。在Android 10及更早版本中,应用程序可以在没有任何限制的情况下访问外部存储。但是在Android 11中,应用程序需要满足特定的要求才能访问外部存储。

在Android 11中,WRITE_EXTERNAL_STORAGE权限被分为两个级别:

  1. legacy:这是兼容模式,应用程序在清单文件中声明WRITE_EXTERNAL_STORAGE权限,并且可以访问外部存储。

  2. scoped:这是新的行为,只有当应用程序请求了MANAGE_EXTERNAL_STORAGE权限,并且用户授予了这个权限后,应用程序才能访问外部存储。

请注意,从Android 11开始,Google鼓励应用程序使用更加严格的Scoped Storage来访问外部存储。Scoped Storage是一种更安全、更可控的外部存储访问方式。

Scoped Storage

Scoped Storage通过将应用程序的文件和目录限制在特定的沙盒中,来提供更加安全的外部存储访问。每个应用程序都会有一个私有的外部存储空间,其他应用程序无法直接访问。这样可以防止应用程序之间的数据冲突和安全隐患。

当应用程序将文件保存到外部存储时,文件将被存储在应用程序的私有目录下。其他应用程序无法直接访问这些文件,除非通过特定的API进行授权。这样可以保护用户的隐私和数据安全。

代码示例

下面是一个使用Scoped Storage进行文件读写的示例:

// 创建文件
File file = new File(getExternalFilesDir(null), "example.txt");

try {
    // 写入文件
    FileOutputStream fos = new FileOutputStream(file);
    fos.write("Hello, World!".getBytes());
    fos.close();

    // 读取文件
    FileInputStream fis = new FileInputStream(file);
    byte[] buffer = new byte[1024];
    int length = fis.read(buffer);
    fis.close();

    // 打印文件内容
    String content = new String(buffer, 0, length);
    System.out.println(content);
} catch (IOException e) {
    e.printStackTrace();
}

上面的代码使用了getExternalFilesDir(null)方法来获取应用程序的私有外部存储目录。然后使用标准的Java IO流进行文件读写操作。

状态图

下面是Scoped Storage的状态图:

stateDiagram
    [*] --> NoPermission
    NoPermission --> LegacyPermission
    NoPermission --> ScopedPermission
    LegacyPermission --> [*]
    ScopedPermission --> [*]

上面的状态图描述了Scoped Storage的三个状态:

  • NoPermission:没有权限访问外部存储。
  • LegacyPermission:有legacy权限,可以访问外部存储。
  • ScopedPermission:有scoped权限,可以访问外部存储。

总结

Android 11中的WRITE_EXTERNAL_STORAGE权限发生了变化,引入了Scoped Storage的概念。Scoped Storage通过将应用程序的文件和目录限制在特定的沙盒中,提供了更加安全的外部存储访问方式。开发人员可以使用getExternalFilesDir(null)方法来获取应用程序的私有外部存储目录,并使用标准的Java IO流进行文件读写操作。

从Android 11开始,Google鼓励开发人员使用Scoped Storage来访问外部存储。Scoped Storage可以提供更好的隐私保护和数据安全。但是对于一些需要直接访问外部存储的旧应用程序,可以使用legacy权限进行兼容。

希望本文能够帮助您理解Android 11中WRITE_EXTERNAL_STORAGE权限的变化和Scoped Storage的使用。