Android 11引入了新的Scoped Storage机制,如果不适用特定的API,应用程序将无法访问外部存储空间中的文件。为了提供写入存储权限,需要在清单文件中声明WRITE_EXTERNAL_STORAGE或MANAGE_EXTERNAL_STORAGE权限,然后使用以下代码请求用户授予权限:
if (Environment.isExternalStorageManager()) {
// 此时应用程序拥有了写入外部存储的权限
} else {
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, PERMISSION_REQUEST_CODE);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PERMISSION_REQUEST_CODE) {
if (Environment.isExternalStorageManager()) {
// 此时应用程序拥有了写入外部存储的权限
} else {
// 用户拒绝了授权请求
}
}
}
上述代码中,首先使用Environment.isExternalStorageManager()方法检查应用程序是否已经拥有了WRITE_EXTERNAL_STORAGE或MANAGE_EXTERNAL_STORAGE权限,如果已经拥有,就可以直接进行写入操作。如果没有,则使用Intent启动外部存储权限设置界面,请求用户授权。在授权结果返回后,再次使用Environment.isExternalStorageManager()方法检查授权结果,如果用户授权成功,则可以进行写入操作,否则需要提示用户无法使用该功能。