В приложении пользователь выбирает каталог через SAF, используя намерение ACTION_OPEN_DOCUMENT_TREE
, и пользователь может создавать различные файлы внутри.
Проблема в том, что когда пользователь меняет рабочий каталог (всегда используя SAF), доступ к этим файлам теряется. Как сохранить доступ как ACTION_CREATE_DOCUMENT
или ACTION_OPEN_DOCUMENT
?
вот мой код
private void showDirectoryPicker() {
Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
i.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
startActivityForResult(i, 12345);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) return;
mDir = data.getData();
grantUriPermission(getPackageName(), mDir, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getContentResolver().takePersistableUriPermission(mDir, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
mFile = DocumentFile.fromTreeUri(getContext(), mDir).createFile("text/plain", "some file.txt").getUri();
- Теперь, если пользователь меняет рабочий каталог, я освобождаю разрешения для старого каталога, поэтому:
getContentResolver().releasePersistableUriPermission(mDir, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
revokeUriPermission(mDir, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
mDir = null;
// ask for another dir
showDirectoryPicker();
Как только я перезапускаю приложение и пытаюсь открыть файл, созданный в старом каталоге, я получаю:
java.lang.SecurityException: No persistable permission grants found for UID <<<uid>>> and Uri 0 @ <<<file uri>>>
пример:
DocumentFile file = DocumentFile.fromSingleUri(getContext(), mFile);
if (file.getName() == null) {
// permissions lost
} else {
// do something
}
как справиться с этим? или просто сохраните права доступа к каталогу, пока приложение не будет удалено ???