在Android 11中,应用程序无法直接在外部存储中创建应用程序目录。相反,应使用特定API来访问外部存储上的特定目录。
以下是一个使用新的存储访问框架(SAF)的示例解决方法,允许在Android 11上访问外部存储中的应用程序目录:
private static final int REQUEST_CODE_PERMISSIONS = 101;
private void requestStoragePermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (!Environment.isExternalStorageManager()) {
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_CODE_PERMISSIONS);
}
} else {
// For devices running below Android 11
// Request normal storage permissions here
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_PERMISSIONS) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
// Permission granted, now you can access app directory in external storage
// Use SAF APIs to access the app directory
} else {
// Permission denied, handle accordingly
}
}
}
}
ACTION_OPEN_DOCUMENT_TREE
来让用户选择应用程序目录:private static final int REQUEST_CODE_OPEN_DIRECTORY = 102;
private void openAppDirectory() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE_OPEN_DIRECTORY);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_OPEN_DIRECTORY) {
if (resultCode == RESULT_OK && data != null) {
Uri uri = data.getData();
// Now you can access the app directory using SAF APIs with the obtained URI
}
}
}
请注意,这只是一个示例,您可能需要根据自己的需求进行适当的修改。