Android 11 引入了新的作用域存储权限机制,以提高应用对外部存储访问的安全性。以下为解决方法,包括代码示例:
private static final int REQUEST_CODE_STORAGE_PERMISSION = 1;
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
// 已经拥有存储权限
// 在此处进行文件操作
} else {
// 请求存储权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_STORAGE_PERMISSION);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_STORAGE_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户授予了存储权限
// 在此处进行文件操作
} else {
// 用户拒绝了存储权限
// 在此处处理拒绝权限的逻辑
}
}
}
// 使用新的 API 访问文件
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "example.txt");
注意事项:
Environment.getExternalStorageDirectory()
)访问外部存储将会触发 Accessing hidden method
错误。因此,应尽量使用新的 API(如 Environment.getExternalStoragePublicDirectory()
)。MANAGE_EXTERNAL_STORAGE
权限或者成为设备的默认文件处理器来实现。详细信息请参考 Android 官方文档。