Я прочитал здесь Как использовать новый API доступа к SD-карте, представленный для Android 5.0 (Lollipop)?
, что разрешения работают рекурсивно для выбранной папки, но я Я не уверен, почему мой код не работает должным образом.
Вот что я делаю:
Я открываю приложение и выбираю папку text_books
, которая является непосредственной дочерней папкой на моей внешней SD-карте. Разрешение предоставляется и сохраняется.
После этого я копирую существующий файл test2.txt
из P C в text_books
и снова открываю приложение. Нажмите кнопку, которая запускает запись в этот файл, но выдает ошибку:
java .lang.SecurityException: Отказ в разрешении: запись com. android .externalstorage.ExternalStorageProvider uri content: // com. android .externalstorage.documents / tree / 11E8-3D14% 3Atext_books% 3Atest2.txt из pid = 9008, uid = 10219 требует android .permission.MANAGE_DOCUMENTS или grantUriPermission ()
Вот некоторые выдержки из кода:
...
public static final int WRITE_SD_REQUEST = 42;
...
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (requestCode == WRITE_SD_REQUEST && resultCode == RESULT_OK) {
Uri treeUri = resultData.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
// Persist access permissions.
final int takeFlags = resultData.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getContentResolver().takePersistableUriPermission(treeUri, takeFlags);
}
}
Вот код, который выполняется после нажатия кнопки
...
Uri treeUri = Uri.parse("content://com.android.externalstorage.documents/tree/11E8-3D14%3Atext_books");
List<UriPermission> persistedUriPermissions = view.getActivity().getContentResolver().getPersistedUriPermissions();
// Delete permissions:
// persistedUriPermissions.stream().forEach(up -> view.getActivity().getContentResolver()
// .releasePersistableUriPermission(up.getUri(), Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION));
persistedUriPermissions = view.getActivity().getContentResolver().getPersistedUriPermissions();
// Check that permission is persisted
if (persistedUriPermissions.stream().anyMatch(up -> up.getUri().equals(treeUri))) {
DocumentFile docFile = DocumentFile.fromSingleUri(view.getActivity(),
Uri.parse("content://com.android.externalstorage.documents/tree/11E8-3D14%3Atext_books%3Atest2.txt"));
try {
OutputStream out = view.getActivity().getContentResolver().openOutputStream(docFile.getUri());
out.write("Overwrite".getBytes());
out.close();
} catch (IOException e) {
Log.e("Cannot write to file", e);
}
} else {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
view.getActivity().startActivityForResult(intent, TtsActivity.WRITE_SD_REQUEST);
}