Android 11 WRITE_EXTERNAL_STORAGE
介绍
在Android 11中,WRITE_EXTERNAL_STORAGE权限的行为发生了一些变化。WRITE_EXTERNAL_STORAGE权限用于向外部存储(如SD卡)写入数据。在Android 10及更早版本中,应用程序可以在没有任何限制的情况下访问外部存储。但是在Android 11中,应用程序需要满足特定的要求才能访问外部存储。
在Android 11中,WRITE_EXTERNAL_STORAGE权限被分为两个级别:
-
legacy
:这是兼容模式,应用程序在清单文件中声明WRITE_EXTERNAL_STORAGE权限,并且可以访问外部存储。 -
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的使用。