Я хотел бы предоставить приложению Syncthing доступ на запись к внешнему хранилищу в Marshmallow. Приложение не запрашивает его явно (в отличие от других приложений, которые используют для этого Storage Access Framework).
На экране разрешений приложения нет разрешений для внешнего хранилища, только для «хранилища» (что, по-видимому, означает внутреннее хранилище). Таким образом, похоже, нет прямого способа предоставить это разрешение.
Мой телефон рутирован, и я мог бы просто запустить Syncthing от имени пользователя root, но эта опция создает много проблем и иногда приводит к тому, что приложение зависает на неопределенный срок.
Есть ли другой способ обойти эту проблему?
Вы можете вручную добавить соответствующее разрешение на запись во внешнее хранилище, AndroidManifest.xml
но это не сработает.
Я оказался в ситуации, похожей на вашу, и я также попытался декомпилировать приложение, добавить запрос разрешения WRITE_EXTERNAL_STORAGE в AndroidManifest.xml и перекомпилировать пакет, но это не сработало.
Начиная с Lollipop, новая политика Android в отношении внешнего SD требует, чтобы любое приложение, которому требуется доступ к вышеупомянутому, использовало интерфейс DocumentProvider. Если вы не предпочитаете работать в Smali, его невозможно реализовать без исходного кода Java. Просто отредактировать манифест недостаточно.
Итак, нет. Невозможно вручную добавить рабочее разрешение WRITE_EXTERNAL_STORAGE ни в Lollipop, ни в Marshmallow. Ваш единственный выбор — попросить разработчика реализовать это.
Я делаю это для УДИВИТЕЛЬНОГО терминального приложения Termux , которое по непонятным мне причинам также не запрашивает это разрешение.
Процедура довольно сложная, включает в себя копирование и редактирование XML-файла вручную и подвергает вас риску помешать загрузке вашей системы. Вам также нужно будет делать это снова каждый раз, когда приложение обновляется. Я думаю, если вы используете редактор с root-доступом, вам не придется беспокоиться о копировании. Хм. Может быть, мне тоже следует поступить так, на самом деле.
Ниже приведены шаги, которые я использую для исправления разрешений для Termux. Вам придется адаптировать их для работы с вашим приложением. Вероятно, они должны быть одинаковыми, за исключением полного имени приложения.
Если вы не знакомы с XML, вы должны быть очень нерешительны, чтобы попробовать это, поскольку вы, вероятно, сделаете свой телефон не загружаемым, если сделаете ошибку.
su -
в этом сеансе, чтобы дать себе root-права.cd /data/system
ls -l packages.xml
packages.xml
. Они будут необходимы позже.-rw-rw---- system:system
как и все те годы, что я этим занимался. На другом типе телефона может быть иначе.cp packages.xml packages.xml.orig
сделать резервную копию этого очень важного системного файлаcp packages.xml /storage/emulated/0/tmp
или в другом месте, в зависимости от того, как устроена файловая система вашего телефона. Если такого каталога не существует, просто создайте его.Теперь отредактируйте файл любым удобным для вас способом (я использую vim
, Termux
но использую любой текстовый редактор), чтобы внести следующие изменения:
/name="com.termux"/
. Это должен быть shared-user
тег (т.е. строка, начинающаяся с <shared-user
)
<item ... />
строку и вставьте прямо под ней.WAKE_LOCK
) на чтение WRITE_MEDIA_STORAGE
.<perms>
узла должен быть
<item name="android.permission.WRITE_MEDIA_STORAGE" granted="true" flags="0" />
Сохраните файл, выйдите из редактора и вернитесь в окно терминала (где у вас все еще запущен корневой сеанс /data/system
).
cp /storage/emulated/0/tmp/packages.xml .
cp
здесь и НЕ, mv
так как mv
не устанавливает разрешения правильно.На этом этапе вы должны быть готовы к перезагрузке. Вероятно, разумно сделать diff packages.xml packages.xml.orig1
или что-то еще, чтобы убедиться, что вы сделали изменение правильно.
После перезагрузки ваше приложение должно иметь доступ для записи на внешнюю SD-карту. Удачи!
Если кто-нибудь знает более чистый способ сделать это, пожалуйста, дайте мне знать! Это неуклюжий автофокус, и есть немалый риск того, что после этого мне придется потратить еще час на ремонт моего телефона.
Повелитель огня
ШанкарГ
ШанкарГ
СарпСТА
androidmanifest.xml
файле, который хранится вbase.apk
файле, который можно найти по адресу/data/app/<app's package name>
Эндрю Т.
Эндрю Т.