private final ActivityResultLauncher<String> mGetContent = registerForActivityResult(new ActivityResultContracts.GetContent(), this::fileSelected);
mGetContent.launch("*/*");
Делается в 2 строчки кода, остается только в fileSelected() написать что делать с полученными данными.
Считается безопасным, так как пользователь сам в другом приложении явно указывает что можно дать приложению.