Google Photos не може видаляти файли з карти SD

Багато користувачів Android зіштовхнулися з прикрою проблемою, пов'язаною з доступом додатків до карти SD. Одним з таких програм є Google Фото. Колись все було нормально. Але в Android 4.4 Google впровадили нову системну конфігурацію, яка забороняє програмам писати на sd-карту. Видаляти зображення через галерею, а потім знову видаляти їх у google photos вкрай незручно.

Google давно хотіли заборонити безперешкодний доступ додатків до sd карти. Пояснюється це тим, що при видаленні програми система не може дізнатися, які файли належать додатку, таким чином sd карта захаращувалась. І ось в Android 4.4 Google ввели таке поняття як SAF (Storage Access Framework). Вони заборонили програмам що-небудь змінювати на sd карті, за винятком особистого каталогу програми. А якщо програма просить, то дає право на читання (але не запис) всього що на карті sd.

Just to sum up, tu є options 3rd-party apps have on KitKat: An app without any permissions: Automatic read and write for designated private folders on primary and secondary storage With WRITE_EXTERNAL_STORAGE, they also have: Завантажити і записати на будь-який public folder на літературі (будівельний) storeage Read (не написати) для будь-якого public folder на літопис (SD card) storeage

Як вчинити у цій ситуації?

Як я вже сказав вище, собі я вже проблему вирішив, виправивши конфігурацію системи (потрібний 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, і тепер програми можуть попросити користувача надати доступ до запису до конкретних каталогів.

Оцінка доступу до вторинної додаткової служби пристроїв У KitKat є введені API, що літні програми read/write file in app-specific directories on secondary store devices, such as SD cards.

Ми маємо слухняність і чіткий, що розробники, які мають доступ до режисерів за ці directories, тому що в Lollipop були зроблені нові ACTION_OPEN_DOCUMENT_TREE intent. Прилади можуть повідомити цей намір стріляти і відновити directory з будь-якого підтримуваного DocumentProvider, включаючи будь-яку shared storage supported by the device. Пристосування можуть бути створені, update, і delete files and directories будь-де під загорнутий strom без будь-якого додаткового користувача interaction. Just як інші document intents, apps може persist this access across reboots.

Але навіть на 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. Можливо, це саме те, що я описую.

Заповніть цю форму, якщо у вас була/є проблема, що описується.

Хардкорна конфа за С++. Ми запрошуємо лише профі.

Читають зараз

Розробка прибуткової Andro > +129 119k 307 147

ARCore: доповнена реальність на Andro > +14 29,1k 36 6

Security Week 28: а Petya важко відкривався, в Andro > +17 17,2k 26 9

Коментарі 30

цитата з довідки гугл:

Що робити, якщо видалена фотографія знову з'явилася в колекції?

Так, зміни були. Але порядок був такий: 4.3 - всім все можна 4.4 - ввели saf, немає можливості запису на sd без root або лазівки 5.0 - можливість надавати додаткам права запису в каталоги на sd 6.0 - Можливість вик. sd карту замість (!) вбудованої пам'яті. 7.0 - віртуальні файли

Зверніть увагу, що нововведення в 6.0 перетворює карту на незнімну. Хоча фізично файли і лежать у ньому, ви можете просто вийняти її і вставити в комп'ютер, т.к. картку відформатовано особливим чином. Крім того, треба розуміти, що в такому режимі sd карта саме замінятиме (але не доповнюватиме) внутрішню пам'ять. Відповідно, перевага sd картки втрачається. І прямого відношення до проблеми доступу на SD це нововведення не має. Як і нововведення у 7.0.

Така ж проблема. root не отримати (занадто рідкісний девайс), прошивку не оновити, застряг на 4.4

Спочатку була версія 4.4

Factory reset технічно не може допомогти – не в його компетенції; підключити пристрій через MTP, знову ж таки, не вийде через поламану ініціалізацію. Єдиний простий вихід – змінити eMMC на новий, але, можливо, є альтернативні шляхи?

Теж був обурений цим. Але, оскільки з першого пристрою на Андроїді використовую root-доступ, для мене проблема вирішилася редагуванням 1 файлу. Пристрій має підкорятися людині, а чи не навпаки.

Мої співчуття користувачам для пристроївяких 4.4 — остання запланована версія, та оновлень не буде.

Таким чином, додаток google plus має кілька іконок у меню додатків: свою та google photos. Я не знав, що буває. Мабуть так зроблено, щоб перехід від google+ photo до googe photos був прозорим для користувача.

Висновок: при попередньому встановленні, додаток Google Photos не встановлено на вже несвіжих версіях ос.

Я провів своє розслідування.

Since aw weeks google photos started to say that can not delete photos from device

У google+ photos тепер пропонується встановити google photos. Але google+ photos було системним додатком і могло видаляти з sd, а додаток google photos, який встановлює користувач, системним не є і на нього поширюються обмеження на запис.

Поділюсь ще деякими моїми дослідженнями:

1) Чи є google api для Google Photos - відпадає Я подумав, а чи не можна створити workaround application, яке б отримувало доступ як до фотографій користувача, так і до sd карти за варіантом «не баг, а фіча». За аналогією з YouTube Data API, чи пошукав чи є щось подібне для GP? Знайшов і зрадів. Так, в інтернеті набридла інформація щодо Google Photos API. Радів я рано. Виявляється, це api надає можливість користуватися алгоритмами googe для розпізнавання об'єктів на знімках, як це відбувається в їхньому додатку. Але ніякого відношення до знімків користувача цей api не має.

2) Перед тим, як проводити модифікації gp, захотів перевірити, чи вдасться взагалі його потім запустити. Отже, я вирішив перепідписати gp своїм ключем і подивитися, чи буде Google працювати з таким додатком. Взяв orig_gp.apk, видалив усередині нього папку META-INF, перейменував наorig_gp_nometa.apk Встановив jdk6, поклав свій keystore в

/.keystore та виконав

Файл перезаписався, перейменував його в gp_resigned_unaligned.apk Знайшов утиліту zipalign (ця утиліта повинна знаходитися десь у sdk, але я не докопав де вона лежить, тому скачав бінарник з інтернету). Виконав

Перевірив про всяк випадок коректність підпису на вирівняному файлі

І, зауважте, ми ще навіть не модифікували програму, тільки перепідписали.

Щоб переконатися, що я все робив правильно, вирішив спробувати перепідписати якусь окрему програму. Взяв coolreader.apk, зробив з ним ті самі маніпуляції, ставлю — все чудово працює.

Отже, я все робив як слід, а проблема полягає в тому, що хтось ще перевіряє підпис на приналежність гуглу. Це швидше за все якісь google services.

3) Принцип роботи OG Youtube Цікаво, а якщо пакет перевіряється на недоторканість, то як модифікували youtube? Вирішив розібратися, як працює OG Youtube. Зрозуміло, що в жодного модифікованого apk немає підпису google. Як встановлюється мод? Є три варіанти. a) безрутовий ставиться як інший пакет паралельно зі справжнім youtube. Авторизація за допомогою microg. б) рутовий простий видаляється системний youtube, ставиться під виглядом гуглівського пакета. Авторизація за допомогою microg. в) рутовий xposed видаляється системний youtube, ставиться під виглядом гуглівського пакета. Авторизація за допомогою справжніх google сервісів шляхом їхнього обману про те, що підпис належить гуглу.

У нашому випадку цікаві варіанти а та б. Не дивуйтеся, що я вказав рутовий варіант: у нас же gp не системне, ми можемо його спокійно видалити, щоб система дозволила поставити пакет з іншим підписом.Принципово а і б нічим не відрізняються, просто в одному випадку це буде встановлений поряд зі справжнім додаток, а в іншому - сучасний.