Почему я не могу писать во внешнее дополнительное хранилище Android?
Мое приложение работает на Android 6.0.1. Он написан на Python/Kivy, что, надеюсь, не имеет значения.
Мои данные могут стать большими. Это не личное. Я хочу, чтобы у пользователя был доступ с ПК. Итак, я хочу сохранить его на внешней SD-карте моего тестового устройства.
Да, уточняю что хочу WRITE_EXTERNAL_STORAGE
в моем манифесте (через файл buildozer.spec). Я подтверждаю, что это сработало, проверив приложение в диспетчере приложений на устройстве. У него правильные разрешения.
Да, я запрашиваю разрешения снова во время выполнения, сразу при запуске. (См. Связанные вопросы. Почему я не могу писать во внешнее хранилище Android? И Не могу писать во внешнее хранилище). Я подтверждаю, что это сработало, предоставив обратный вызов. Предоставляются разрешения на чтение и запись.
Затем мое приложение получает python-for-android secondary_external_storage_path()
. Как ни странно, он возвращает None! Изучив исходный код, он сначала пытается опроситьandroid.os.Environment
перед использованием некоторых эвристик, основанных на переменных среды. Основываясь на моих расчетах, используяadb shell
, он должен найти переменную окружения, SECONDARY_STORAGE
который объявлен, но установлен в /storage/extSdCard
- несуществующая локация! - поэтому он терпит неудачу и возвращает None.
Из-за этого я временно жестко кодирую адрес: /storage/3143-6351/
и создал под ним подкаталог.
Я поместил несколько файлов в этот каталог.
Вот результат ls одного из файлов. На мой неопытный взгляд разрешения кажутся разумными.
-rwxrwx--x root sdcard_rw 0 2020-07-07 16:13 heard.csv
Родительский каталог имеет аналогичные разрешения.
Мое приложение запускается, счастливо читает файлы в этом каталоге, но когда оно пытается написать:
PermissionError: [Errno 13] Permission denied: '/storage/3143-6351/{path ellided}/heard.csv'
Раньше это работало, когда я имел дело с первичным вторичным хранилищем (то есть не со скрытым хранилищем приложений, а с общим хранилищем непосредственно на телефоне (но сбивчиво его называли /sdcard
).
Почему мне отказывают в разрешении на запись, а мне дают разрешение на чтение?