可以通过SAF框架授予目录内容的访问权限来访问应用的专属目录

// startActivityForResult已弃用,推荐使用 Activity Result API
ActivityResultLauncher<Uri> launcher = registerForActivityResult(new ActivityResultContracts.OpenDocumentTree(), new ActivityResultCallback<Uri>() {
    @Override
    public void onActivityResult(Uri result) {
        // 如需在设备重启后保留对文件的访问权限,可以用以下代码持久化访问权限
        int takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION;
        getContentResolver().takePersistableUriPermission(result, takeFlags);
    }
});
// 注意不能直接对 Android/data/ 根目录进行授权
// 指定文件选择器在首次加载时应显示的目录的Uri
Uri uri = DocumentFile.fromTreeUri(this, pathToUri("/storage/emulated/0/Android/data/xxx.xxx")).getUri();
// 调用系统的文件选择器选择目录
launcher.launch(uri);

检查目录的访问权限

// 获取已持久化的的访问权限
for (UriPermission up : getContentResolver().getPersistedUriPermissions()) {
    // isReadPermission() 和 isWritePermission() 检查目录的访问权限
    if (up.getUri().equals(uri) && up.isReadPermission() && up.isWritePermission()) {
        // 对目录有访问权限
    }
}
// 将绝对路径转为Uri
public static Uri pathToUri(String path) {
    if (path.endsWith("/")) {
        path = path.substring(0, path.length() - 1);
    }
    path = path.replace("/storage/emulated/0/", "").replace("/", "%2F");
    return Uri.parse("content://com.android.externalstorage.documents/tree/primary%3A" + path);
}

一个无聊的人。。。