Невозможно записать на внешнюю SD, несмотря на доступное разрешение - PullRequest
0 голосов
/ 26 апреля 2020

Я прочитал здесь Как использовать новый 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);
}
...