Ограничения доступа к хранилищу доступа не работают

Я использую Android Storage Access Framework для доступа к некоторым файлам на SD-карте. Для меня важно сохранить эти разрешения, чтобы иметь возможность редактировать файлы после перезагрузки устройства.

Поэтому в соответствии с документацией Storage Access Framework я использую разрешения Persist, которые предоставляют пользователю постоянный доступ к файлам через ваше приложение, даже если устройство было перезапущено.

Однако через некоторое время я заметил, что для некоторых пользователей разрешения были как-то отменены. Потому что, когда я пытаюсь использовать SAF для записи, я получаю android.system.ErrnoException: open failed: EACCES (Permission denied) после этого исключения. Я проверяю, какие разрешения у меня есть, используя mContext.getContentResolver().getPersistedUriPermissions() однако он возвращает пустое список. Я уверен, что пользователь предоставит мне правильные разрешения и разрешения для текущей установленной Sd-карты, потому что я отслеживаю эти действия в базе данных.

В настоящее время в этом случае я показываю сборщик документов, поэтому пользователь может предоставить мне еще один раз новые разрешения, но просить пользователя выполнить одно и то же действие часто не является удобным для пользователя.

Что может привести к отзыву разрешений? И как я могу помешать этому отзыву?

Я тестировал на всех своих устройствах несколько перезагрузок телефона, меняя время, удаляя вставку SD-карты, но не смог потерять какие-либо защитные разрешения.

У меня есть следующий код для получения разрешений:

 private void openDocumentTree() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); startActivityForResult(intent, REQUEST_CODE); } public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE) { Uri treeUri = data.getData(); final int takeFlags = data.getFlags() & ( Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); mContext.getContentResolver().takePersistableUriPermission(treeUri, takeFlags); //this is my internal class for saving and restoring tree uri permissions. final Permission permission = Permission.from(treeUri); mPermissionDao.save(permission); } } 

Solutions Collecting From Web of "Ограничения доступа к хранилищу доступа не работают"

Вам нужны дополнительные флаги при запросе ACTION_OPEN_DOCUMENT_TREE .

openDocumentTree должен выглядеть так:

 private void openDocumentTree() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); intent.addFlags( Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION); startActivityForResult(intent, REQUEST_CODE); } 

Просмотрите документы для FLAG_GRANT_PERSISTABLE_URI_PERMISSION и FLAG_GRANT_PREFIX_URI_PERMISSION