Как открыть доступ к файлам на андроид 11
Google Play ограничивает использование важных разрешений и разрешений с высоким уровнем риска, в том числе доступ ко всем файлам для приложений.Это касается только приложений, предназначенных для Android 11 (API уровня 30) и запрашивающих разрешение MANAGE_EXTERNAL_STORAGE , которое было добавлено в Android 11. Эти правила не влияют на использование разрешения READ_EXTERNAL_STORAGE .
Если вашему приложению не нужен доступ к разрешению MANAGE_EXTERNAL_STORAGE , удалите его из файла манифеста, иначе вы не сможете опубликовать свой продукт. Допустимые случаи использования описаны ниже.
Если ваше приложение соответствует требованиям или для него действуют исключения, вам нужно заполнить в Play Console декларацию и указать в ней разрешение на доступ ко всем файлам и другие разрешения с высоким уровнем риска.
Если вы не подадите декларацию или не приведете приложение в соответствие с требованиями, мы можем удалить его из Google Play.
Когда можно запрашивать разрешение на доступ ко всем файлам
Запрашивать доступ ко всем файлам можно, только если нет альтернативных способов работы с файлами, более безопасных для конфиденциальности пользователей (таких как платформа доступа к хранилищу или MediaStore API).
Кроме того, это разрешение должно применяться только в определенных случаях и только для работы основных функций приложения. Основные функции – это то, для чего создано приложение. Без них приложение невозможно использовать. Основные функции и все входящие в них элементы должны быть явно указаны в описании приложения.
Запрашивать доступ ко всем файлам могут только приложения, предназначенные для резервного копирования и восстановления, управления документами, защиты от вирусов, а также файловые менеджеры.
Приложениям, получившим это разрешение, запрещается использовать его для не заявленных или запрещенных целей.
Использование
Допустимое разрешение*
Управление файлами
Основная функция приложения – действия с файлами и папками за пределами предназначенного для него хранилища (просмотр, изменение и управление, включая обслуживание).
Резервное копирование и восстановление
Работа приложения невозможна без автоматического доступа к различным каталогам за пределами предназначенного для него хранилища.
Защита от вирусов
Основные функции приложения – сканирование устройства и защита от вирусов.
Управление документами
Основные функции приложения – действия с совместимыми файлами за пределами предназначенного для него или общего хранилища (определение местоположения файлов на устройстве, а также их просмотр и изменение).
Поиск (на устройстве)
Основная функция приложения – поиск по файлам и папкам во внешнем накопителе устройства.
Шифрование и блокировка диска или папок
Основная функция приложения – шифрование файлов и папок.
Перенос данных
Основная функция приложения – помощь при переходе на новое устройство.
*Декларация с этими разрешениями должна быть рассмотрена и одобрена командой Google Play.
Google Play может делать временные исключения для приложений, которые не относятся к перечисленным выше категориям, если:
- Разрешение используется для работы основных функций приложения.
- Других способов обеспечить работу приложения не существует или
использование альтернативных способов, более безопасных для конфиденциальности (например, MediaStore API или платформы доступа к хранилищу), наносит серьезный ущерб работе основных функций приложения.
- Разработчик использует оптимальные методы защиты, которые снижают угрозу нарушения конфиденциальности.
В декларации разрешений разработчик должен объяснить, почему функции приложения не могут быть реализованы с помощью платформы доступа к хранилищу или MediaStore API.
Примечание. Перечисленные выше разрешения могут запрашиваться не только критически важными службами, но и приложениями операторов или сервисами OEM, а также частными приложениями, опубликованными на платформе корпоративный Google Play.В некоторых случаях приложения стремятся получить доступ к конфиденциальным данным пользователей тогда, когда существуют более безопасные альтернативы или же риски, связанные с уязвимостью данных, неоправданны.
Ниже приведен список распространенных примеров использования, когда разрешение на доступ ко всем файлам ( MANAGE_EXTERNAL_STORAGE ) предоставляться не будет:
- Доступ к медиафайлам (см. раздел Альтернативы ниже).
- Любой выбор файлов, в ходе которого пользователь вручную указывает отдельные файлы (см. раздел Альтернативы ниже).
Примечание. Список приведен лишь в качестве примера, возможны и другие ситуации. Подробные инструкции можно найти в статьях для разработчиков, касающихся доступа ко всем файлам и рекомендаций по работе с областями хранения данных.
Использование
Альтернативы
Доступ к медиафайлам
MediaStore API позволяет приложениям просматривать медиафайлы на внешнем накопителе и взаимодействовать с ними, не запрашивая доступ ко всем файлам.
Для доступа к файлам в общем хранилище можно использовать множество более безопасных для конфиденциальности альтернатив, например платформу доступа к хранилищу.
В новой версии Android Google не только внедрила новые полезные фичи, но и внесла некоторые изменения в файловую систему. Если быть точным, «корпорация добра» запретила сторонним приложениям выполнять действия с папками /Android/obb и /Android/data — файловые менеджеры выдают ошибку: «Не удалось создать папку… Android/obb. Permission denied. Не удалось создать… Android/obb. No such file or directory. Файлы не были извлечены».
По словам команды разработчиков, они пошли на этот шаг ради безопасности. Но вместе с этим теперь нельзя устанавливать сторонние приложения, требующие кэша. После установки Android 11, я первым же делом решил изучить этот вопрос и попытался обойти ограничение. На данный момент я нашёл только один метод, не требующий Root-права, — использование adb (Android Debug Bridge). Сразу отмечу, что для этого способа обязательно наличие ПК.
Содержание
Подготовка
Для начала необходимо на смартфоне зайти в «Настройки», затем в раздел «Для разработчиков» и включить в нём «Отладку по USB». Если у вас нет пункта «Для разработчиков», сперва придётся зайти в раздел «О телефоне», найти там «Номер сборки» и тапнуть по нему несколько раз, пока не появится надпись «Вы стали разработчиком».
Следующим шагом станет скачивание adb на ПК. Для этого необходимо зайти на официальный сайт и загрузить софт для своей платформы, после чего распаковать полученный ZIP-архив в удобном месте (если у вас Windows, для упрощения рекомендую переместить извлечённую папку в корень диска C).
Как скопировать кеш в Android/obb или Android/data на Android 11
Итак, всё настроено и смартфон подключен к ПК. Если у вас Windows, первым делом нужно открыть «Командную строку» от имени администратора. Сделать это можно, набрав в поиске системы «cmd» и выбрав соответствующий пункт.
Далее необходимо прописать следующую команду: cd <путь к распакованной папке>. Например, если, как я советовал выше, папка находится в корне диска C, команда будет выглядеть следующим образом: cd C:/platform-tools. Как только вы окажетесь в нужной директории, можно прописать команду adb devices. Если всё сделано верно, в консоли отобразится подключённое устройство. В случае, если появится надпись unauthorized, необходимо со смартфона подтвердить вход в режим отладки на данном компьютере (скорее всего, это окно появится сразу же, как смартфон будет подключен к ПК).
Для владельцев компьютеров на macOS действия почти аналогичные. После загрузки и распаковки инструментов, необходимо открыть терминал, перейти в директорию с файлами (по дефолту это будет папка Downloads) командой cd <путь к распакованной папке> и прописать ./adb devices. По сути, отличие от Windows лишь в том, что каждый раз вместо adb надо писать ./adb.
Переходим непосредственно к загрузке файлов. Команда, которая для этого потребуется, строится по следующему шаблону: adb push <путь к нужному файлу на вашем ПК> <путь к папке obb или data на смартфоне>. Для владельцев macOS-устройств всё то же самое, но с ./ в самом начале команды. Важное замечание касательно второго пути (на смартфоне): он выглядит как sdcard/android/obb или sdcard/android/data.
Примечательно, что adb не умеет отправлять на устройство целые папки, поэтому для этого придётся заранее создать папку, и уже в неё кидать файл(ы). Создаётся папка командой: adb shell mkdir <путь вместе с желаемой папкой>.
В качестве примера я рассмотрю процесс переноса кэша для игры GRIS. Изначально он поставляется в папке com.devolver.grispaid, поэтому сначала я создам директорию на смартфоне командой adb shell mkdir sdcard/android/obb/com.devolver.grispaid.
Как удалить кеш из Android/obb или Android/data на Android 11
Для удаления файлов необходимо прописать следующую команду: adb shell rm -f <путь к файлу>. Если же необходимо удалить директорию со всем содержимым внутри, пригодится следующая команда: adb shell rm -rf <путь к директории>.
Вывод
Google, несомненно, усложнила доступ к папкам data и obb, но всё же работать с этими директориями можно, пускай и с помощью дополнительных инструментов. Если вы знаете другие методы обхода данных ограничений в Android 11, делитесь ими в комментариях.
Все последние улучшения в Android на уровне ОС касаются защиты приложений и пользовательских данных, а также более упорядоченного предоставления доступа. Несмотря на преимущества изменений, они также предполагают дополнительную работу для разработчиков.
В целях повышения конфиденциальности пользователей Android 11 добавлены некоторые существенные изменения и ограничения. Как указано в превью поведенческих изменений, они состоят в следующем:
Принудительное использование хранилища с ограниченной областью видимости (Scoped storage): доступ к каталогам внешних хранилищ ограничен каталогом конкретного приложения и определенными типами носителей, созданных приложением.
Автоматический сброс разрешений: если пользователи не взаимодействовали с приложением в течение нескольких месяцев, система автоматически сбрасывает конфиденциальные разрешения приложения.
Фоновый доступ к местоположению: пользователи должны быть направлены в системные настройки, чтобы предоставить приложениям разрешение на фоновое определение местоположения.
Видимость пакета: когда приложение запрашивает список установленных приложений на устройстве, возвращенный список фильтруется.
Недавно я глубоко погрузился в концепцию Scoped storage, чтобы понять, чего ожидать в будущем, и соответственно подготовить свое Android-приложение к переменам.
Прежде чем перейти к тому, что касается реализации, сначала разберемся, как было организовано хранилище данных до Android 10:
- Частное хранилище (Private Storage): все приложения имеют собственный частный каталог во внутреннем хранилище, то есть Android/data/, невидимый для других приложений.
- Общее хранилище (Shared Storage): остальная часть хранилища, помимо частных разделов, называлась общим хранилищем. Оно включает в себя все медиа- и немедийные файлы, сохраненные в системе, и приложение с разрешением на хранение может легко получить к ним доступ.
Есть ли , на ваш взгляд, какие-то проблемы в структуре, которую мы рассмотрели выше? Не хотелось ли вам, чтобы Google что-нибудь здесь изменил?
Давайте подробнее остановимся на некоторых проблемах.
- Допустим, у нас приложение для электронной коммерции, которому нужен доступ к хранилищу только для того, чтобы пользователь смог загрузить фото профиля. Значит, ему нужно предоставить доступ к определенному файлу или файловой системе. Другой пример: нам нужно загрузить или сохранить медиа-файл из чат-приложения, а для этого нужен доступ к одному медиа-файлу. Так зачем же предоставлять доступ к хранилищу целиком?
- Может оказаться так, что конфиденциальные данные, такие как медицинские рецепты или банковские чеки, будут доступны всем приложениям, установленным на устройстве.
- После удаления приложения нет возможности убедиться, что все связанные с ним данные и файлы полностью очищены.
Уверен, это должно заставить вас задуматься о безопасности приложений и данных, а также о конфиденциальности и организации. Не волнуйтесь, недавнее обновление Google для Android уже спешит на помощь.
Google приводит две веские причины, по которым вводится это изменение: безопасность и уменьшение оставшихся после удаления приложений данных.
Песочница приложений, изолирующая приложения друг от друга, — это ключевая часть дизайна Android. Взяв за основу все тот же самый основополагающий принцип, в Android Q компания Google представила хранилище с ограниченной областью видимости.
Эти изменения первоначально планировалось применить к каждому приложению на телефоне под управлением Android 10 или более поздней версии, но из-за негативной реакции разработчиков Google изменил курс и потребовал использовать хранилище с ограниченной областью видимости только для приложений, ориентированных на Android API уровня 29, то есть Android 10. Но с Android 11 Scoped Storage вернулся, и на сей раз Google вряд ли передумает.
- Улучшенная атрибуция: приложению будет предоставлен доступ к блокам хранения, которые содержат соответствующие данные приложения.
Посмотрите на структуру хранения данных в Android 10 и выше:
Частное хранилище остается без изменений, но общее хранилище дополнительно делится на коллекцию медиа и загрузок (немедийных файлов).
- Уменьшение беспорядка в файлах: система свяжет хранилище с приложениями-владельцами, чтобы системе было легче находить файлы, относящиеся к приложению. Таким образом, при удалении приложения все связанные с ним данные также будут удалены.
- Предотвращение злоупотребления разрешением READ_EXTERNAL_STORAGE: предоставление этого разрешения на сегодняшний день дает приложению доступ ко всему внешнему хранилищу, где хранятся личные фотографии, документы, видео и другие потенциально конфиденциальные файлы. Однако при применении Scoped storage приложения смогут видеть только собственные папки данных и определенные типы носителей, такие как музыкальные файлы, используя другие API хранилища.
С этими обновлениями пользователи смогут лучше контролировать файлы и предоставление к ним доступа. Кроме того, на устройстве освободится дополнительное пространство, так как ненужные файлы будут удаляться вместе с приложением.
- Неограниченный доступ к индивидуальному хранилищу приложений: приложение будет иметь неограниченный доступ к внутреннему и внешнему хранилищу как для чтения, так и для записи. В Android 10 не нужно предоставлять разрешение на хранение для записи файлов в каталог приложений на SD-карте.
- Неограниченный доступ к коллекциям медиафайлов и загрузок (добавленным собственноручно): вы получаете неограниченный доступ для добавления файлов в коллекции и загрузки приложения. При сохранении изображения, видео или любого другого медиафайла из коллекции не нужно запрашивать разрешение (если файл хранится в организованной коллекции.)
- Доступ к коллекции медиафайлов других приложений можно получить с помощью разрешения READ_STORAGE_PERMISSION. Разрешение WRITE_STORAGE_PERMISSION со следующей версии станет устаревшим и будет работать так же, как READ_STORAGE_PERMISSION.
- Для записи и чтения немедийных файлов, добавляемых другими приложениями, понадобятся API-интерфейсы доступа к хранилищу.
Примечание из документации по обновлению хранилища в Android 11: Если приложение использует устаревшую модель хранения и ранее предназначалось для Android 10 или ниже, возможно, его данные сохраняются в каталоге, к которому приложение не может получить доступ, когда задействована модель хранилища с областью видимости. Прежде чем перейти на Android 11, перенесите данные в каталог, совместимый с хранилищем ограниченной области видимости. В большинстве случаев перенести данные можно в каталог конкретного приложения.
Чтобы дать разработчикам дополнительное время для тестирования, приложения, ориентированные на Android 10 (уровень API 29), все еще могут запрашивать атрибут requestLegacyExternalStorage. Этот флаг позволяет приложениям временно отказаться от изменений, связанных с областью хранения, таких как предоставление доступа к различным каталогам и различным типам медиафайлов.
Любое приложение, предназначенное для Android 11 или более поздней версии, должно использовать новые API хранилища, включая хранилище с ограниченной областью видимости. Изменения в соглашении разработчика Google Play гласят, что, начиная с 1 августа 2020 года, все новые приложения, представленные в Google Play, должны быть нацелены на Android 10 или более позднюю версию, а все обновления существующих приложений должны быть ориентированы на Android 10 или более позднюю версию с 1 ноября 2020 года. Если все продолжится в том же духе, то в следующем году приложения, скорее всего, будет обязательно ориентировать уже на Android 11.
Сейчас самое подходящее время для того, чтобы изучить и реализовать новые изменения.
Кратко рассмотрим некоторые часто выполняемые операции хранения и способы их выполнения:
- Выбор файла: используйте ACTION_OPEN_DOCUMENT — он открывает системное приложение для выбора файлов, предоставляя пользователю возможность выбрал файл, который нужно открыть. Чтобы отобразить только те типы файлов, которые поддерживаются приложением, укажите тип MIME.
- Выбор папки: Интент ACTION_OPEN_DOCUMENT можно заменить на ACTION_OPEN_DOCUMENT_TREE .
Примечание: этот доступ будет действителен до тех пор, пока пользователь не перезагрузит устройство. Если приложение хочет сохранить доступ, получая доступ к URI с помощью преобразователя содержимого, преобразователь содержимого должен вызвать метод takePersistableUriPermission .
Кроме того, если вы перебираете большое количество файлов в каталоге, доступ к которому осуществляется с помощью ACTION_OPEN_DOCUMENT_TREE , производительность приложения может снизиться.
- Создание файла: чтобы сохранить файл в определенном месте, используйте ACTION_CREATE_DOCUMENT .
Примечание из документации разработчиков Android: ACTION_CREATE_DOCUMENT не может перезаписать существующий файл. Если приложение пытается сохранить файл с тем же именем, система добавляет число в скобках в конце имени файла.
Если приложение предназначено для Android 10 (уровень API 29) или выше, то для того, чтобы оно могло извлекать неотредактированные метаданные Exif из фотографий, необходимо объявить разрешение ACCESS_MEDIA_LOCATION в манифесте приложения, а затем запросить это разрешение во время выполнения.
Внимание: поскольку вы запрашиваете разрешение ACCESS_MEDIA_LOCATION во время выполнения, нет никакой гарантии, что приложение имеет доступ к неотредактированным метаданным Exif из фотографий. Приложение требует явного согласия пользователя, чтобы получить доступ к этой информации.
Существует обходной путь для приложений по типу файловых менеджеров, которые тоже должны иметь полный доступ ко всему. Нужно выполнить следующие простые шаги, перечисленные в инструкции по обновлению хранилища в Android 11:
Приложениям, действующим по закону, эти разрешения необходимы.
Как только пользователь предоставит разрешение на широкий доступ, он получит нефильтрованное представление MediaStore, которое включает в себя немедийные файлы.
Только приложения, которым Google предоставит такую возможность, будут иметь полный доступ к хранилищу. Для этого отправьте форму декларации в Google Play и получите место в утвержденном списке.
Что делать, если приложение задействует кастомный выбор файлов, который отображает точные каталоги данных? В этом случае ничего нельзя сделать. Возможно, стоит перейти на системное средство выбора файлов.
Копировать файлы с компьютера или ноутбука (далее ПК) на мобильное устройство (далее Андроид) и обратно требуется часто и (в случае больших файлов) проще всего это делать, используя Wi-Fi.
Основное требование: Все устройства (один или несколько ПК, Андроиды) должны быть подключены к одной сети!
Итак, диспозиция: Win 7, статический IP, единственный пользователь, созданный при установке, у которого отсутствует пароль.
Если в Win 7 включен общий доступ с парольной защитой (по умолчанию), то ES проводник даже не сможет просмотреть список расшаренных папок, его сразу пошлют, потому что у него документов нету.
Если общий доступ с парольной защитой отключен, то список расшаренных папок в ES проводнике отображается, но доступ можно получить только к папке Users, т.к. к ней по умолчанию разрешен доступ для всех.
Вариантов - два: либо отключить парольную защиту и предоставлять права на доступ к каждой расшаренной папке пользователю гость/Guest (свойства папки>Доступ, там в списке выбрать Guest и нажать добавить), либо не отключать парольную защиту, а создать пользователя, имеющего пароль, и опять же предоставить ему права на доступ к расшаренной папке в том же диалоге. После этого имя и пароль этого пользователя требуется вводить в настройках сервера в ES Проводнике.
По умолчанию Win 7 дает доступ к расшариваемой папке только единственному нашему пользователю, у которого нет пароля, соответственно авторизоваться по сети он не может.
Если Вам не хочется выбирать пользователя при каждой загрузке, то настройте автоматический вход.
-
Samba-сервер
Для примера используем Samba Server for Android, он позволяет работать с SD-картой коммуникатора, как с расшаренной папкой ПК. Для работы программы требуются root-права.
Устанавливаем и запускаем программу. При первом запуске будет выдана краткая инструкция по использованию. Первый шаг - задать пароль для доступа к ресурсам мобильного устройства. Для этого нажмите Menu>Settings>Password и введите пароль. Там же можно при желании сменить имя пользователя, а также указать рабочую группу (имя должно совпадать с именем рабочей группы в настройках ПК) и NetBIOS-имя Андроида (то, что будет отображаться в сетевом окружении на ПК). После настройки вернемся в главное окно программы и нажмем Menu>Enable. Это запустит сервер SAMBA на Андроиде.
На компьютере с Windows MAC-адрес можно узнать, выполнив в командной строке (Пуск>Выполнить>cmd) команду
Подключение по локальной сети - Ethernet адаптер:
DNS-суффикс этого подключения . . :
Описание . . . . . . . . . . . . : Realtek PCIe GBE Family Controller
Физический адрес. . . . . . . . . : 00-1F-D0-D4-53-2D
Dhcp включен. . . . . . . . . . . : нет
IP-адрес . . . . . . . . . . . . : 192.168.5.2
Маска подсети . . . . . . . . . . : 255.255.255.0
Основной шлюз . . . . . . . . . . : 192.168.5.1
DNS-серверы . . . . . . . . . . . : 192.168.5.1
Здесь физический адрес и есть нужный нам MAC. Т.е. 00-1F-D0-D4-53-2D.
MAC-адрес Андроида можно посмотреть в пункте "О телефоне" меню настроек (Меню>Настройки>О телефоне>Состояние>MAC-адрес Wi-Fi)
2. Перенастроить сетевые карты на ПК (ноутбуке) на использование статических IP-адресов В Windows 2k/XP это делается в свойствах сетевого подключения, в настройках протокола TCP/IP. Выбрать "Использовать следующий IP-адрес", указать IP (IP должен быть из локальной сети роутера, обычно 192.168.0.xxx), маску подсети (обычно 255.255.255.0), шлюз по умолчанию (IP-адрес роутера) и DNS-серверы (либо IP роутера, либо DNS-серверы провайдера, либо открытые DNS-серверы, например Google DNS - 8.8.8.8, 8.8.4.4).
Например у меня настройки выглядят так (адрес роутера - 192.168.5.1):
Ребрендинг шапки любезно предоставлен Fidelich - тыц.
Застопорился на 2 этапе. Не пойму какой логин и пароль вводить ES проводнику, чтобы получить доступ к общим файлам и папкам на ноутбуке с Windows 7. Вроде пароль для беспроводного соединения нашел (но не уверен, что он), а вот логин не могу найти.Подскажи, где выставлять в Windows 7 эти логин и пароль?
skunsofob,
Имя и пароль пользователя Windows.
Т.е. можно либо вписать имя и пароль того пользователя под которым заходишь в Windows, либо создать отдельного, назвать его, например, Android.
Возможно проблема также в том, что у пользователя Windows отсутствует пароль.
Насчет Win 7 не знаю, но Win XP Pro запрещает доступ к расшаренным папкам пользователям без пароля.
Еще вариант - попробовать поставить в настройках сервера галку "Анонимный вход".
Галку Анонииный вход ставил - не помогает. А паролей у меня действительно нет как на ПК с ХР, так и на ноуте с Win7. Неужеле придется отдельного пользователя создавать под паролем? По проводам сеть делал - паролей не требовалось.
Т.е. доступ с ПК на ноут с Win 7 есть и без пароля?
Имя пользователя Win 7 и пустой пароль в настройках ES проводника не срабатывает?
Проверь настройки Win7 в Панель управления -> Сети и Интернет -> Центр управления сетями и общим доступом ->Изменить дополнительные параметры общего доступа (Control Panel -> All Control Panel Items -> Network and Sharing Center-> Change advanced sharing settings), там в самом низу еще раз дополнительные параметры и указать "Отключить защиту паролем". После этого анонимный вход с Андроида должен заработать.
Как вариант - попробуй временно отключить брандмауэр в Win 7. Возможно он мешает.
Что-то не получаетсяНажимаю "сканировать" находится мой пк при том что ни одна папка не расшарена, при попытке к нему соеденится пишет неверный логин и пароль - не пойму какой логин, какой пароль. пишет неверный логин и пароль - не пойму какой логин, какой пароль.
Логин и пароль пользователя Windows, имеющего доступ к расшаренным папкам.
Нажимаю "сканировать" находится мой пк при том что ни одна папка не расшарена,Так я никакой логин и пароль не использую для учетной записи (Windows 7)
Да пробовал (создавал папку и расшаривал к ней доступ), не работает все равно, брандмауэр отключал
Так я никакой логин и пароль не использую для учетной записи (Windows 7)Как минимум один пользователь был создан при установке ОС. Загляните в Панель управления>Учетные записи или введите в поле поиска меню Пуск команду
и нажмите Enter.
После этого будет выдан список всех имеющихся учетных записей пользователей
Временно (ну или постоянно, хотя это небезопасно) отключите парольную защиту расшаренных папок.
Учетная запись есть, но пароль в ней никакой не используется (если не используется что вводить?), почему запрашивается не пойму
Анонимный вход в настройках сервера в ES проводнике попробуйте включить.
Включен анонимный вход, все равно не пускает. Пишет: неправильний пароль, возможные причины: недостаточно прав пользователя
Может есть альтернативное решение со значительно простой настройкой?)
Может есть альтернативное решение со значительно простой настройкой?)Попробуйте другие файл-менеджеры с поддержкой сети.
Если не заработает, то включите защиту паролем для расшаренных папок и создайте пользователя (например Android) с паролем.
Разобрался.
Итак, диспозиция: Win 7, статический IP, единственный пользователь, созданный при установке, у которого отсутствует пароль.
Если в Win 7 включен общий доступ с парольной защитой (по умолчанию), то ES проводник даже не сможет просмотреть список расшаренных папок, его сразу пошлют, потому что у него документов нету.
Если общий доступ с парольной защитой отключен, то список расшаренных папок в ES проводнике отображается, но доступ можно получить только к папке Users, т.к. к ней по умолчанию разрешен доступ для всех.
Вариантов - два: либо отключить парольную защиту и предоставлять права на доступ к каждой расшаренной папке пользователю гость/Guest (свойства папки>Доступ, там в списке выбрать Guest и нажать добавить), либо не отключать парольную защиту, а создать пользователя, имеющего пароль, и опять же предоставить ему права на доступ к расшаренной папке в том же диалоге. После этого имя и пароль этого пользователя требуется вводить в настройках сервера в ES Проводнике.
По умолчанию Win 7 дает доступ к расшариваемой папке только единственному нашему пользователю, у которого нет пароля, соответственно авторизоваться по сети он не может.
Если Вам не хочется выбирать пользователя при каждой загрузке, то настройте автоматический вход.
Скоро выходит Android 12, но в этом августе уже с 11-й версии разработчикам придётся использовать новые стандарты доступа приложений к внешним файлам. Если раньше можно было просто поставить флаг, что ваше приложение не поддерживает нововведения, то скоро они станут обязательными для всех. Главный фокус — повышение безопасности.
Переход на новую версию API — довольно трудоёмкая операция, требующая больших затрат на её поддержку при введении крупных апдейтов. Далее расскажу немного про наш переход и возникшие при этом трудности.
Что происходит
Если вы уже знакомы с теорией, то этот раздел можно пропустить — тут я хочу поверхностно сравнить подходы к предмету в разных версиях операционной системы.
В Android есть внутреннее Internal Storage (IS) и внешнее хранилище External Storage (ES). Исторически это были встроенная память в телефоне и внешняя SD-карта, поэтому ES был больше, но медленнее и дешевле. Отсюда и разделение — настройки и критически важное записывали в IS, а в ES хранили данные и большие файлы, например, медиа. Потом ES тоже стал встраиваться в телефон, но разделение, по крайней мере логическое, осталось.
У приложения всегда есть доступ к IS, и там оно может делать что угодно. Но эта папка только для конкретного приложения и она ограничена в памяти. К ES нужно было получать доступ и, кроме манипуляции со своими данными, можно было получить доступ к данным других приложений и производить с ними любые действия (редактировать, удалять или украсть).
Но после разделения на внутреннее и внешнее хранилища все равно оставались проблемы. Многие приложения могли хранить чувствительную информацию не только в IS, но и в ES — то есть ответственность лежала целиком на разработчиках и на том, кто хочет завладеть файлами.
В Android решили всё это переделать ещё в 10-й версии, а в 11-й это стало обязательным.
Чтобы минимизировать риски для пользователя в Google решили внедрить Scoped Storage (SS) в ES. Возможность проникнуть в папки других приложений убрали, а доступ есть только к своим данным — теперь это сугубо личная папка. А IS с 10-й версии ещё и зашифрована по умолчанию.
В Android 11 Google зафорсировала использование SS — когда таргет-версия SDK повышается до 30-й версии API, то нужно использовать SS, иначе будут ошибки, связанные с доступом к файлам. Фишка Android в том, что можно заявить совместимость с определённой версией ОС. Те, кто не переходили на 11, просто говорили, что пока не совместимы с этой версий, но теперь нужно начать поддерживать нововведения всем. С осени не получится заливать апдейты, если не поддерживаешь Android 11, а с августа нельзя будет заливать новые приложения.
Если SS не поддерживается (для девайсов ниже 10-й версии), то для доступа к данным других приложений требуется получить доступ к чтению и записи в память. Иначе придётся получать доступ к файлам через Media Content, Storage Access Framework или новый, появившийся в 11-м Android, фреймворк Datasets в зависимости от типа данных. Здесь тоже придётся получать разрешение доступа к файлу, но по более интересной схеме. Когда расшариваемый файл создаёшь сам, то доступ к нему не нужен. Но если переустановить приложение — доступ к нему опять потребуется. К каждому файлу система привязывает приложение, поэтому когда запрашиваешь доступ, его может не оказаться. Особо беспокоиться не нужно, это сложно отследить, поэтому лучше просто сразу запрашивать пермишен.
Media Content, SAF и Datasets относятся к Shared Storage (ShS). При удалении приложения расшаренные данные не удаляются. Это полезно, если не хочется потерять нужный контент.
Хотя даже при наличии SS можно дать доступ к своим файлам по определённой технологии — через FileProvider можно указать возможность получения доступа к своим файлам из другого приложения. Это нормально, потому что файлы расшаривает сам разработчик.
Также добавилась фича — если приложение не использовалось несколько месяцев, то снимаются все пермишены и доступы к системным элементам. По best practice разрешение запрашивается по необходимости (то есть непосредственно перед использованием того, на что спрашиваем разрешение), поэтому мы просто перед выполнением какого-либо действия проверяем, есть ли у нас пермишены. Если нет, то запрашиваем.
В то же время перекрыли доступы к приложениям внутри девайса. Если раньше можно было отследить, что установлены определённые приложения и отправлять к ним соответствующие интенты, то сейчас мы должны прямо в манифесте прописать, что работаем именно с этими приложениями, и только после этого получить доступ.
В качестве примера можем взять шаринг — мы шарим множество приложений, и их всех нужно указывать в манифесте, иначе они не обнаружатся. Начнём перебирать пакет установленных приложений — будет информация, что не указанного в манифесте приложения нет и при шаринге всё отвалится.
Перейдём к практике.
Переход на новую версию
Основная функциональность по работе с файлами в приложении iFunny представлена в виде сохранения мемов в память и расшаривания их между приложениями. Это было первое, что требовалось починить.
Для этого выделили в общий интерфейс работу с файлами, реализация которого зависела от версии API.
FilesManipulator представляет собой интерфейс, который знает, как работать с файлами и предоставляет разработчику API для записи информации в файл. Copier — это интерфейс, который разработчик должен реализовать, и в который передаётся поток вывода. Грубо говоря, мы не заботимся о том, как создаются файлы, мы работаем только с потоком вывода. Под капотом до 10-й версии Android в FilesManipulator происходит работа с File API, после 10-й (и включая её) — MediaStore API.
Рассмотрим на примере сохранения картинки.
Так как операция сохранения медиафайлов достаточно длительная, то целесообразно использовать MediaStore.Images.Media.IS_PENDING , которая при установлении значения 0 не дает видеть файл приложениям, отличного от текущего.
По сути, вся работа с файлами реализована через эти классы. Шаринг в другие приложения автоматически сохраняют медиа в память устройства и последующая работа с URI уже происходит по новому пути. Но есть такие SDK, которые ещё не успели перестроиться под новые реалии и до сих пор используют File API для проверки медиа. В этом случае используем кеш из External Storage и при необходимости провайдим доступ к файлу через FileProvider API.
Помимо ограничений с памятью в приложениях, таргетированных на 30-ю версию API, появилось ограничение на видимость приложения. Так как iFunny использует шаринг во множество приложений, то данная функциональность была сломана полностью. К счастью, достаточно добавить в манифест query, открывающую область видимости к приложению, и можно будет также полноценно использовать SDK.
Для неявных интентов тоже приходится добавлять код в манифест, чтобы задекларировать то, с чем будет работать приложение. В качестве примера выложу часть кода, добавленного в манифест.
После проверок запуска UI-тестов на девайсах с версиями API 29-30 было выявлено, что они также перестали корректно отрабатываться.
Эта проблема из разряда видимости других приложений, поэтому достаточно было добавить строку <package android:name="androidx.test.orchestrator" />
.
Тест удачно запустился, но возникла другая ошибка — Allure не может сохранить отчёт в память устройства, падает с ошибкой.
Очевидно из-за Scoped Storage стало невозможно сохранять файлы в другие папки, поэтому снова почитав документацию по управлению файлами в памяти на девайсе, обнаружил интересный раздел. Там рассказано, как для нужд тестов открыть доступ к папкам девайса, но с существенными ограничениями, которые можно почитать тут.
Так как нам нужно использовать этот пермишен только для тестов, то нам условия подходят. Поэтому я быстренько написал свой ShellCommandExecutor, который выполняет команду adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow на создании раннера тестов.
На Android 11 тесты удачно запустились и стали проходить без ошибок.
После попытки запуска на 10-й версии Android обнаружил, что отчет Allure также перестал сохраняться в память девайса. Посмотрев issue Allure, обнаружил, что проблема известная, как и с 11-й версией. Достаточно выполнить команду adb shell appops set --uid PACKAGE_NAME LEGACY_STORAGE allow . Сказано, сделано.
Запустил тесты — всё еще не происходит сохранения в память отчёта. Тогда я обнаружил, что в манифесте WRITE_EXTERNAL_STORAGE ограничен верхней планкой до 28 версии API, то есть запрашивая работу памятью мы не предоставили все разрешения. После изменения верхней планки (конечно, для варианта debug) и запроса пермишена на запись тесты удачно запустились и отчёт Allure сохранился в память устройства.
Добавлены следующие определения пермишенов для debug-сборки.
После всех вышеописанных манипуляций с приложением, можно спокойно устанавливать targetSdkVersion 30, загружать в Google Play и не беспокоиться про дедлайн, после которого загружать приложения версией ниже станет невозможно.
Читайте также: