Google Photos не может удалять файлы с SD карты

в 14:00, , рубрики: android, delete, gallery, Google Photos, Google Фото, micro sd, remove, SAF, sd card, storage access framework, галерея, доступ, платформа доступа к хранилищу, права, Программирование, Разработка под android, реверс-инжиниринг, удаление

Многие пользователи Android столкнулись с досадной проблемой, связанной с доступом приложений к SD карте. Одним из таких приложений является Google Фото. Когда-то всё было нормально. Но в Android 4.4 Google внедрили новую системную конфигурацию, которая запрещает приложениям писать на sd-карту. Удалять изображения через галерею, а затем снова удалять их же в google photos крайне неудобно.

Для себя я проблему решил рутованием девайса и исправлением конфигурации. Подробности на видео:

Но для обычных пользователей должно всё работать без root. О том как это осуществить я предлагаю обсудить в этой статье. Приглашаю представителей компании Google, Android разработчиков и всех интересующихся под хабракат.

Некоторых пользователей лишили функционала без предупреждения. Я видел комментарии пользователей со следующей ситуацией. Раньше они хранили фото на sd карте и пользовались google photo без каких-либо проблем. Потом производитель телефона предложил сделать OTA обновление (до 4.4 или выше), на что пользователи соглашались. Но они и думать не могли, что потеряют функционал. Теперь google photo не может удалять снимки, и чтобы обезболить процесс управления снимками, вынуждены хранить их на внутренней памяти, что само по себе болезненно.

В чём здесь дело

Google давно хотели запретить беспрепятственный доступ приложениям к sd карте. Объясняется это тем, что при удалении приложения, система не может узнать, какие файлы принадлежат приложению, таким образом sd карта захламлялась. И вот в Android 4.4 google ввели такое понятие как SAF (Storage Access Framework). Они запретили приложениям что-либо менять на sd карте, за исключением личного каталога приложения. А если приложение просит, то даёт право на чтение (но не запись) всего что на sd карте.

Цитата отсюда:

Just to sum up, here are the options 3rd-party apps have on KitKat:
An app without any permissions:
Automatic read and write for designated private folders on the primary and secondary storage
With WRITE_EXTERNAL_STORAGE, they also have:
Read and write for any public folder on the primary (built-in) storage
Read (not write) for any public folder on the secondary (SD card) storage

То есть для приложений, которые не предустановлены на телефоне, а в моём случае google Фото не было предустановлено, официально вообще нет возможности как-то управлять файлами! Google, я не понимаю, как можно было так поступить. Не доделали фичу – доделывайте. Но зачем в потребительские устройства внедрять то, что ещё не работает?

Как поступить в этой ситуации?

Как я уже сказал выше, для себя я уже проблему решил, исправив конфигурацию системы (нужен root). А что насчёт «простых» пользователей, которые не слышали о root? У меня есть несколько идей, как решить эту проблему. Некоторые из них подходят только для Google, а какие-то, возможно, по силам реализовать сообществу. Итак, какие есть варианты?

Вариант «Личный каталог»

Google должны сделать, чтобы по возможности всё работало. Понятно, что они не могут советовать рутовать устройство. Но что насчёт личного каталога /storage/extSdCard/Android/data/com.google.android.apps.photos? Что они там хранят? Скорее всего там не корзина, потому что удаляемые в корзину файлы находятся в /data/user/0/com.google.android.apps.photos/files/trash_files. Я не знаю, может в Android не принято хранить пользовательские данные в таких каталогах. Просто предлагаю рабочий вариант.

Т.е. если приложение видит, что работает на Android 4.4 и нет прав доступа, то вывести сообщение вроде «Нет доступа. Предлагаем в настройках вашей системной камеры задать сохранение в каталог /storage/extSdCard/Android/data/com.google.android.apps.photos/DCIM. Имейте в виду, что при удалении google photos все снимки будут удалены». Сейчас приложение игнорирует данный каталог. Если в него положить снимок, каталог не появится в списке выбора для синхронизации.

Скорее всего это мёртвый вариант, поскольку камера должна быть системной (иначе она не сможет писать в чужой каталог на sd карте), а системная камера скорее всего не умеет выбирать каталог для сохранения (на S4 не умеет точно).

Вариант «Не баг, а фича»

Но оказывается разработчики нашли лазейку, всё таки позволяющую приложениям манипулировать с файлами. Я сам проверял: восстановил исходный platform.xml (в котором нет доступа на запись на sd карту), перезагрузился, установил total commander и… Удаление работает! И даже код есть.

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

Вариант «Всё плохо, но вы обновитесь»

В той статье написано, что не на всех устройствах сработает такой хак. Тут уж ничего не остаётся, кроме как просто показать сообщение, что нет доступа. Правда в нём можно намекнуть, что помог бы рут, либо переход на другую версии Android, причём на более старую тоже сойдёт.

Вариант «Закладка»

Ещё у меня была идея, что Google могут обновить свои google сервисы (а это системное приложение) таким образом, чтобы к нему могло обращаться несистемное приложение google photos с просьбой удалить файл. И не нужен будет root. Пойдёт ли на это google?

Решение для более свежих версий Android

В Android 5.0 google улучшила SAF, и теперь приложения могут попросить пользователя предоставить доступ на запись в конкретные каталоги.

Цитата отсюда:

Richer access to secondary shared storage devices
In KitKat we introduced APIs that let apps read/write file in app-specific directories on secondary storage devices, such as SD cards.

We heard loud and clear that developers wanted richer access beyond these directories, so in Lollipop we added the new ACTION_OPEN_DOCUMENT_TREE intent.  Apps can launch this intent to pick and return a directory from any supported DocumentProvider, including any of the shared storage supported by the device.  Apps can then create, update, and delete files and directories anywhere under the picked tree without any additional user interaction.  Just like the other document intents, apps can persist this access across reboots.

This gives apps broad, powerful access to manage files while still involving the user in the initial selection process.  Users may choose to give your app access to a narrow directory like “My Vacation Photos,” or they could pick the top-level of an entire SD card; the choice is theirs.

Но даже на Android 5 google фото не использует эту возможность, а просто сообщает, что не имеет доступа. Я считаю, что прежде чем синхронизировать какой-то каталог, приложение сначала должно просить права на запись в него через SAF, чтобы можно было удалять снимки. Это можно сделать прямо с той самой активности, где переключателем выбираешь, какие каталоги хочешь синхронизировать (Настройки — Автозагрузка и синхронизация — Выберите папки). Google, почему вы так не делаете?

Подведём итог

Вот как себя ведёт приложение сейчас:

Пользователь нажал помоечку
Имеется ли непосредственный доступ на запись на sd карту?
Да — удаляем снимок.
Нет – выводим сообщение что нет доступа.

Как должно быть:

Пользователь нажал помоечку
Имеется ли непосредственный доступ/через лазейку на запись на sd карту?
Да — удаляем снимок.
Нет — тогда
— Мы работаем на Android 5.0+?
— Да — запросить доступ к каталогу через SAF и удалить снимок.
— Нет — (т. е. скорее всего это 4.4. Но может быть и специально изменённый 4.3-, настроенный как в 4.4) тогда:
— — Вывести сообщение: «Нет доступа, но вам поможет рут, либо смена версии Android» либо «Настройте системную камеру на сохранение снимков в /storage/extSdCard/Android/data/com.google.android.apps.photos/DCIM», либо «Обновите google сервысы, мы через них дадим доступ на запись» на усмотрение google.

Нужны разработчики

Если тут есть представители google, передайте информацию разработчикам. Потому что данная тема обсуждается уже давно, но Google не исправляет ситуацию.

А для читательов, которые умеют разрабатывать на Android хочу задать вопрос. Возможно ли изменить приложение так как я сказал, но своими силами, не дожидаясь google? Я знаю про несоответствие цифровой подписи, но в нашем случае это не важно. Ведь всё это нужно только если приложение не системное. А если оно не системное, то можно его удалить и затем установить с другой подписью. Я видел модифицированное приложение вместо youtube — OGYouTube. Возможно это как раз то, что я описываю.

Заполните эту форму, если у вас была/есть описываемая проблема.

Результаты опроса

Количество ответов: 101 (на момент 20 сентября 2016):
Google Photos не может удалять файлы с SD карты - 1
Google Photos не может удалять файлы с SD карты - 2
Google Photos не может удалять файлы с SD карты - 3
Google Photos не может удалять файлы с SD карты - 4
Google Photos не может удалять файлы с SD карты - 5
Google Photos не может удалять файлы с SD карты - 6
Google Photos не может удалять файлы с SD карты - 7
Google Photos не может удалять файлы с SD карты - 8
Google Photos не может удалять файлы с SD карты - 9

На этом считаю, что сделал своё дело. Теперь ход Google. Или сообщества.

Автор: LinuxComp

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js