Предоставить приложению доступ на запись к внешнему хранилищу, которое не запрашивает его?

Я хотел бы предоставить приложению Syncthing доступ на запись к внешнему хранилищу в Marshmallow. Приложение не запрашивает его явно (в отличие от других приложений, которые используют для этого Storage Access Framework).

На экране разрешений приложения нет разрешений для внешнего хранилища, только для «хранилища» (что, по-видимому, означает внутреннее хранилище). Таким образом, похоже, нет прямого способа предоставить это разрешение.

Мой телефон рутирован, и я мог бы просто запустить Syncthing от имени пользователя root, но эта опция создает много проблем и иногда приводит к тому, что приложение зависает на неопределенный срок.

Есть ли другой способ обойти эту проблему?

Это похоже на проблему XY. Ваша проблема X, и вы думаете, что Y — это решение, поэтому весь вопрос, похоже, заключается в том, чтобы сделать Y вместо решения X. // Если ваше приложение зависает, обратитесь к разработчику и обратитесь за помощью к нему. Обратите внимание, что вы не можете предоставить разрешение, которое не было запрошено (на самом деле вы можете, но это ничего не даст) приложением.
Я ценю вашу точку зрения. Тем не менее, это «достигнет» чего-то в том смысле, что приложение вполне способно записывать в эти папки и фактически пытается это сделать. Android блокирует это.
Другие разрешения могут быть предоставлены без запроса — например, с использованием более ранних приложений для управления приложениями в более ранних версиях Android (при рутировании) или предоставления разрешений на экране текущих настроек. Проблема в том, что этого разрешения нет в списке.
@ShankarG Разрешения, к которым приложение будет запрашивать доступ при его установке, определяются в его androidmanifest.xmlфайле, который хранится в base.apkфайле, который можно найти по адресу/data/app/<app's package name>
Я не уверен, что предоставленная вами ссылка предназначена для Android, но если вы используете Wrapper of syncthing для Android , то он уже запрашивает разрешение на запись во внешнее хранилище.

Ответы (2)

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

Я оказался в ситуации, похожей на вашу, и я также попытался декомпилировать приложение, добавить запрос разрешения WRITE_EXTERNAL_STORAGE в AndroidManifest.xml и перекомпилировать пакет, но это не сработало.

Начиная с Lollipop, новая политика Android в отношении внешнего SD требует, чтобы любое приложение, которому требуется доступ к вышеупомянутому, использовало интерфейс DocumentProvider. Если вы не предпочитаете работать в Smali, его невозможно реализовать без исходного кода Java. Просто отредактировать манифест недостаточно.

Итак, нет. Невозможно вручную добавить рабочее разрешение WRITE_EXTERNAL_STORAGE ни в Lollipop, ни в Marshmallow. Ваш единственный выбор — попросить разработчика реализовать это.

Я делаю это для УДИВИТЕЛЬНОГО терминального приложения Termux , которое по непонятным мне причинам также не запрашивает это разрешение.

Процедура довольно сложная, включает в себя копирование и редактирование XML-файла вручную и подвергает вас риску помешать загрузке вашей системы. Вам также нужно будет делать это снова каждый раз, когда приложение обновляется. Я думаю, если вы используете редактор с root-доступом, вам не придется беспокоиться о копировании. Хм. Может быть, мне тоже следует поступить так, на самом деле.

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

Если вы не знакомы с XML, вы должны быть очень нерешительны, чтобы попробовать это, поскольку вы, вероятно, сделаете свой телефон не загружаемым, если сделаете ошибку.

  • Убедитесь, что вы не обновляете приложения (отключите автообновление) или делаете что-либо еще, что может привести к изменению 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)
    • Для вашего приложения это может оказаться другой строкой, содержащей полное имя вашего приложения, в зависимости от того, есть ли у вашего приложения запись в предыдущем разделе этого файла. Также может не быть записи о разрешениях для вашего приложения, и в этом случае вам, я думаю, придется сделать ее с нуля. Я бы подумал, что это, вероятно, будет хорошо, но я действительно не знаю; таким образом вы можете вызвать системные проблемы. Пусть покупатель будет бдителен. Но да, если вы найдете этот узел для Termux, скопируете его и вставите копию под записью Termux, это, вероятно, сработает.
  • Скопируйте последнюю <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-карту. Удачи!

Если кто-нибудь знает более чистый способ сделать это, пожалуйста, дайте мне знать! Это неуклюжий автофокус, и есть немалый риск того, что после этого мне придется потратить еще час на ремонт моего телефона.