Как перенести фотографии на устройство Android Jelly Bean, сохранив при этом исходную метку времени?

Я недавно купил Nexus 4 и хочу перенести на него фотографии с моего предыдущего устройства. В моем предыдущем Android-телефоне использовалось стандартное запоминающее устройство USB, которое создавало 0 проблем при копировании туда и обратно, но Nexus 4, как и многие другие современные Android-телефоны, я полагаю, вместо этого использует MTP, который имеет интересную особенность отказа от копирования оригинала. даты/временные метки файлов, используя вместо этого дату, когда файлы копируются.

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

Есть ли способ перенести фотографии на Android-телефон Jelly Bean, который не поддерживает USB-накопитель с сохранением исходных временных меток?

Вещи, которые я пробовал до сих пор:

  • Передача через USB MTP
  • ADB push (как полные папки, так и отдельные файлы)
  • Перенос по SSH (используя SSHDroid + WinSCP)
  • Загрузка и скачивание из Dropbox
  • Передача ZIP-файла через MTP и распаковка файла на телефоне
  • Передача с другого телефона через bluetooth
  • Функция QuickPic "исправить дату"
  • Локальная синхронизация
  • Коррекция даты фото
  • FTPSyncX
  • Дымовые сигналы
  • Кричать по телефону

Ни один из них не сохранил метку времени, и это сводит меня с ума.

(Кроме того, у меня еще нет root-прав, но если для единственного жизнеспособного способа требуется root, я бы также приветствовал этот ответ.)

Поддерживает ли Android распаковку файлов .tar? Если это так, возможно, вы могли бы скопировать файл .tar с изображениями. Я не знаю, изменит ли распаковка временную метку отдельных файлов или нет.
@Chance пробовал это раньше, но тоже не помогло; проблема в том, что ничто не имеет прав на запись временной метки по умолчанию, поэтому прямо сейчас ничего нельзя сделать, кроме как получить root-права.

Ответы (20)

Вы не можете, это текущая проблема с разрешением ( отчет об ошибке здесь ) папки /sdcard Android 4.0+, если она не использует FAT32 (но FUSE).

Причина: Произошел переход от FAT32 к унифицированному пользовательскому хранилищу для приложений и мультимедийных данных (с использованием ext4) в одной файловой системе.

Нам надоело видеть, как OEM-производители включают много ГБ внутренней памяти для музыки, в то время как пользователям по-прежнему не хватало места для приложений и данных. Этот подход позволяет нам объединить все в один том, что намного лучше.

— Дэн Моррилл, инженер Android в Google.

Старые свойства FAT32 эмулируются с использованием слоя FUSE для совместимости с существующими приложениями. Кроме того: /data/ и /sdcard на устройствах Google, начиная с Nexus 7, используют только один раздел (/data/media представляет содержимое «sdcard» и отображается для приложений с помощью уровня FUSE).

Вот реализация CyanogenMod драйвера FUSE, если вам интересно посмотреть исходный код. Однако похоже, что установка атрибутов временной метки реализована.

РЕДАКТИРОВАТЬ: Это работает только с root.

Точная причина: Все файлы принадлежат root.sdcard_rw (см. здесь ).

Вызывающий абонент без h uid=0 не может вызвать системный вызов utimensat() , он уже дает сбой на уровне VFS (EPERM) для меток времени, отличных от текущих:

  1. эффективный идентификатор пользователя вызывающего абонента должен совпадать с владельцем файла; или же
  2. вызывающая сторона должна иметь соответствующие привилегии.

Чтобы внести какие-либо изменения, кроме установки обеих временных меток на текущее
время (т. е. время не равно NULL, и оба поля tv_nsec не имеют
значения UTIME_NOW, а оба поля tv_nsec не имеют значения UTIME_OMIT),
должно применяться условие 2 или 3 выше.

Спасибо за информацию, будем надеяться, что это то, что Google может и захочет решить, потому что, насколько я могу судить, проблема не в уровне предохранителей или протоколе mtp, а в строгих привилегиях, которые были установлены там, которые способ кажется довольно недавним (4.2.1?), поскольку приложение для коррекции даты фото, опубликованное ниже, похоже, работает со старыми устройствами на основе 4.0 fuse/mtp, такими как galaxy nexus.
Обновление для будущих читателей: это остается неисправленным в 4.2.2.
Обновление для еще большего числа будущих читателей: не исправлено в 6.0 marshmallow.

Недавно я столкнулся с этой проблемой на Nexus 5 и безуспешно пробовал большинство перечисленных здесь решений. В моем случае это, похоже, вызвано известной ошибкой со стандартным Android ( источник ).

Мое решение было следующим: я использовал Windows 8.1, но нет причин, по которым это не сработает на OSX/Linux (однако на устройстве требуется root).

  1. На своем ПК создайте архив .tar.gz со всеми файлами, которые вы хотите передать.

    • Я использовал для этого 7zip . Стоит отметить, что в Windows вам нужно сначала создать архив .tar, а затем применить сжатие .gz.
  2. Перенесите архив на устройство с помощью FTP, убедившись, что используется команда MFMT.

    • FTP-сервер поддерживает MFMT на стороне устройства. Просто установите и включите, никаких дополнительных настроек не требуется.
    • На ПК я использовал Filezilla — вам нужно убедиться , что установлен флажок «Передача»> «Сохранить временные метки передаваемых файлов» .
  3. На устройстве распакуйте архив в оболочку от имени пользователя root.

    • Используя эмулятор терминала , сначала убедитесь, что у вас есть root-доступ с помощью suкоманды. Возможно, вам потребуется предоставить доступ, если появится SuperSU.
    • Перейдите в каталог, содержащий архив .tar.gz, с помощью команды cd, например:cd /sdcard/
    • Распакуйте архив, используя следующее:tar -xvf ARCHIVE_NAME_HERE.tar.gz
    • Примечание. По какой-то причине, когда я извлекал файлы непосредственно в DCIM/Cameraкаталог, изображения вообще не отображались в приложении стоковой галереи. Если это произойдет с вами, я предлагаю вам извлечь файлы в другой каталог, а затем переместить (не копировать) файлы в каталог вашей камеры. Я подозреваю, что это вызвано проблемой с разрешениями. Вы можете использовать терминал или файловый менеджер для перемещения файлов.
  4. Перезагрузитесь на всякий случай.

Это позволило сохранить все атрибуты «даты изменения» файлов и оставить все фотографии в правильном порядке при просмотре в приложении галереи.

Они не отображаются в галерее из-за медиа-индекса. Он не распознает вашу терминальную операцию, но если вы используете приложение файлового менеджера, оно сообщает о новых перемещенных файлах в индекс, и теперь они снова найдены. Вы уверены, что часть ftp действительно нужна? Интересно, потому что фтп не может изменить файлы, которые находятся внутри тара, так почему это должно быть важно?
@mgutt Я думаю, вы правы в том, что часть FTP не требуется. Я собирал воедино кусочки информации из других решений для предложений, и это то, что в итоге сработало для меня!

Проверьте данные EXIF ​​и посмотрите, есть ли там отметка времени.

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

Ничего такого. Данные EXIF ​​есть, и приложение сообщило, что оно успешно изменило временные метки, когда я их использовал, но они остались прежними; Я перезагрузился и также удалил кеш галереи, но это не помогло. Приложение требует root? Кажется, что на временных метках есть какая-то защита от записи, которую ничто не может преодолеть.

Это вопрос, который меня очень беспокоит, когда я сталкиваюсь с устройствами, которые имеют только MTP, но не режим Mass Storage. У меня также есть опасения по этому поводу по тем же причинам, что и у Мана.

После некоторого тестирования я нашел временное решение, которое, возможно, сможет сохранить отметку времени.

Он использует внешний кард-ридер sdcard / OTG, а также команду cp с -a, которая позволяет сохранить отметку времени. Но требование - телефон должен быть рутирован.

  1. Сначала скопируйте данные на SD-карту.
  2. Прочтите его с помощью слота для карт памяти / устройства чтения карт OTG
  3. использовать оболочку adb и получить root-права (su)
  4. cp -a * данные с карты во внутреннюю память.

Как упоминалось в другом ответе, на устройствах, которые используют FUSE для эмуляции SD-карты (например, современные устройства Nexus), только root может изменять временные метки файлов в формате /sdcard. Поскольку такие вещи, как MTP и ADB, не запускаются от имени пользователя root, вы не можете сохранить временные метки с помощью этих методов. Однако, если ваше устройство рутировано, вы можете исправить метки времени с помощью отдельного шага позже.

При восстановлении полной резервной копии /sdcardс ПК с Linux на планшет я использовал эту команду, чтобы исправить все метки времени после загрузки файлов с помощью adb push:

find . | while read file; do timestamp_stat=$(stat -c "%y" "$file"); timestamp=$(date +"%Y%m%d.%H%M%S" -d "$timestamp_stat"); echo "$timestamp: $file"; adb shell su -c "touch -t $timestamp \"/sdcard/$file\""; done

Это должно быть запущено из корня каталога на ПК, который соответствует /sdcardна устройстве. (Или, если вы загрузили что-то, кроме полной /sdcardрезервной копии, измените путь в touchкоманде ближе к концу. Но вы должны запустить это из любого каталога на ПК, соответствующего каталогу в touchкоманде.)

Это работает так: он просматривает все файлы на стороне ПК, получает метку времени каждого и запускает touchкоманду от имени пользователя root на устройстве, чтобы установить там метку времени соответствующего файла.

Обратите внимание, что это запустит отдельную suкоманду для каждого отдельного файла. Если в вашей корневой программе (например, SuperSU) включено ведение журнала, вы можете отключить его, чтобы избежать создания большого количества записей в журнале. И если ваше устройство настроено на запрос подтверждения при каждом suзапросе, вы, вероятно, захотите временно изменить это. (Возможно, можно придумать вариант, который направляет поток touchкоманд в единую корневую оболочку на устройстве, но простой способ сделать это не сработал, когда я пробовал, и я не хотел тратить много времени на это)

Я успешно использовал это на Nexus 10 под управлением Android 5.1.

У меня точно такая же проблема. Кажется, что он блокируется предохранителем на Nexus 4 с Stock JellyBean 4.2.1.

SYMLINKS:
/sdcard -> /storage/emulated/legacy
/storage/emulated/legacy -> /mnt/shell/emulated/0

MOUNT POINT:
/mnt/shell /dev/fuse /mnt/shell/emulated fuse \
    rw,nosuid,nodev,relatime,user_id=****,group_id=****,default_permissions,allow_other 0 0

Эта информация была получена через сеанс оболочки adb; Я предполагаю, что предохранитель будет использоваться для всех учетных записей уровня приложения.

TL; DR Судя по всему, это невозможно сделать без рутирования телефона.

Мое «решение» на данный момент состоит в том, чтобы загружать изображения с прошлых телефонов по одному в хронологическом порядке, с паузами между ними, в другой каталог. Вот сценарий оболочки Linux, который я использую: [old_pictures]$ for f in $(ls -1 * | sort -t _ -k 2); do adb push $f /storage/sdcard0/DCIM/Past/; sleep 3; done;Если вы идете по этому пути, сначала выполните тестовую загрузку, чтобы убедиться, что вы удовлетворены. Кроме того, отключите мгновенную загрузку в Google+, чтобы избежать «двойных загрузок».
Спасибо, это помогает; как ваш скрипт: и mtp через windows, и adb push сбрасывают соединение для меня после первой тысячи файлов или около того в моем случае, плюс некоторые файлы случайно оказываются поврежденными, вы видите то же самое? в основном, как эта проблема описана здесь: code.google.com/p/android/issues/detail?id=35185 (возможно, мне следует задать отдельный вопрос, поскольку это не имеет прямого отношения к самим временным меткам. Должен любить mtp)

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

Предыстория вопроса

Это ошибка Android. Это не позволяет пользователю без полномочий root изменять дату модификации файлов ( https://code.google.com/p/android/issues/detail?id=18624 с момента введения многопользовательской/песочницы с файловой системой FUSE) . И не сохраняет метку времени при копировании файлов по протоколу MTP ( https://code.google.com/p/android/issues/detail?id=92635 ).

Обходной путь для пользователей Google Фото

Фотографии упорядочены с использованием информации EXIF, если она доступна, поэтому вы можете просто использовать любые способы установки для них правильных данных EXIF. Любая камера должна установить это автоматически для вас, просто убедитесь, что в них правильно установлены дата/время.

Для видео или если вы не хотите устанавливать данные EXIF, просто перейдите на https://photos.google.com/ и загрузите оттуда свое видео/фотографии. Он сохраняет временную метку модификации, которая у вас есть на вашем компьютере, и, поскольку она синхронизируется с вашим устройством, вы увидите фотографию в приложении, правильно отсортированную, как только вы закончите загрузку.

Используйте инструмент синхронизации, такой как, например , FolderSync , который должен соответствующим образом заботиться о временных метках. Инструменты синхронизации должны быть специализированы для обработки всех аспектов реального поддержания синхронных копий, включая, конечно, метки времени.

Я попробовал пару инструментов синхронизации, но ни один из них не синхронизировал отметку времени, потому что я думаю, что есть какая-то защита. Спасибо за ответ.
Вы пробовали пробную версию FTPSyncX ? Возможно, не самый изысканный вид (разработчик не дизайнер). Но я использую Pro уже около года, и он отлично синхронизирует временные метки через SFTP/SSH (единственный протокол, который я использую — приложение может обрабатывать больше).
Я проверю это, но, учитывая, что SSHDroid у меня не работает, я думаю, что я тоже не получу временные метки.
Я почти уверен, что так и будет. Я до сих пор помню, как тяжело далась эта часть разработчику — мы часами просиживали в скайпе, обсуждая проблему :) В Windows была уродливая проблема со временем, которая иногда сообщала о вещах неправильно... О, получаю ОТ :) Просто попробуйте, не может повредить, не так ли? И дайте нам знать, как это получилось...
Ничего такого. FTPSyncX Trial в качестве клиента на телефоне, freeSSHd в качестве сервера на моем ноутбуке, я могу подключаться и синхронизировать файлы через STP/SSH, но временная метка изображений, переданных на телефон, по-прежнему перезаписывается на текущую дату.
Гоша. Тогда это должно быть связано с изменениями, связанными с Android 4.x/MTP. Извините за это, у меня нет устройства 4.x, чтобы проверить, но попробовать все же стоило.
Np, я ценю помощь. Думаю, мне придется сдаться на данный момент, уже потратил слишком много времени на это.
Ага. Это одна из причин, по которой я бы никогда не купил устройство без съемного хранилища (здесь: Android-устройство без слота для SD-карты). Если устройство перестанет отвечать, вы даже не сможете передать свои данные другому. Для меня абсолютный проигрыш.
FolderSync сохраняет метку времени только для загруженных файлов и только если вы используете FTP или SMB: tacit.dk/foldersync/faq#Q26 Если вы загрузите их, например, на новый телефон, метка времени будет потеряна. Из-за этого у меня есть полная резервная копия всех моих медиафайлов на моем NAS с правильными временными метками, но я не могу переместить их на новый телефон, не потеряв это :(
В худшем случае всегда можно восстановить временные метки для фотографий из их данных Exif. Инструменты для этого существуют для большинства платформ. Но, конечно, я не знал, что FolderSync сохраняет их только в одну сторону, поскольку я редко синхронизирую с ПК на Android (обычно наоборот). Мои фотографии хранятся на внешней SD-карте, так что я могу просто заменить ее ;)

СОХРАНЕНИЕ ДАТЫ, ИЗМЕНЕННОЙ НА УСТРОЙСТВЕ NEXUS --- КОРЕНЬ НЕ ТРЕБУЕТСЯ ---

  • С Android на ПК: используйте MTP
  • С ПК на Android: используйте Droid Explorer

ваше здоровье.. :)

он сохраняет дату изменения. Я не знаю, как это делает Droid Explorer. но это просто работает.

убедитесь, что USB-отладка отмечена перед использованием Droid Explorer.

гм... есть одно ограничение... Droid Explorer может передавать только файлы, но не папки.

  • с помощью Droid Explorer скопируйте файлы в телефон Android в определенную папку
  • затем с файловым менеджером внутри Android переместите эти файлы в нужную папку, не используйте копию, потому что копия изменит дату изменения, а вырезать - нет.
Droid Explorer требует ROOT, не так ли?
@AntonK Да, Droid Explorer требуется Root для сохранения метки времени. Если Root недоступен, дата будет перезаписана: maxrev.de/…

Используйте PTP вместо MTP при подключении телефона через USB. У меня это работает, я использую Samsung Note 4, подключенный к машине с Ubuntu 14.04. Однако подключение в качестве PTP позволяет копировать только изображения/изображения. Все другие методы копирования файлов (Bluetooth, WIFI, файловый менеджер) на внешний диск изменят дату.

Я проверил это с Windows 10 и Note 3, используя CM 12.1 (Android 5.1.1). Я переместил файлы (единственный способ, которым Windows позволяет сохранить), но не сохранил временные метки. :(

Вы можете использовать адб

  1. Включите режим разработчика на мобильном устройстве.

  2. Включите отладку универсальной группы безопасности на мобильных устройствах.

  3. Установите ADB на свой ноутбук.

  4. Подключите свой мобильный телефон к ноутбуку с помощью USB.

  5. Откройте терминал своего ноутбука и войдите в свой мобильный, используя приведенные ниже команды.

    adb-устройства adb-оболочка

  6. Найдите точный путь, куда вы хотите поместить свои файлы.

  7. Выйдите из оболочки adb с помощью команды exit.

  8. Используйте приведенную ниже команду для передачи файлов с вашего ноутбука на мобильный без каких-либо метаданных (созданного/измененного времени)

    adb push source_path target_mobile_path

Вы можете отправлять папки и несколько файлов с помощью adb pushкоманды за один раз.

Вы можете использовать ту же процедуру и команду adb pull source_mobile_path target_laptop_pathдля копирования файлов с мобильного телефона на ноутбук, не затрагивая даты.

Мое решение сохранить дату модификации при копировании файла на Android-устройство с помощью MTP:

Проверено на LG G2 (без рута), Andorid 4.4.2 и HTC one M7, Andorid 4.4.2:

  1. Сетевой ресурс папки для копирования на компьютер (Win 8)
  2. Используйте SyncMe Wireless для копирования файлов с компьютера на устройство

Насколько я вижу, даты модификации полностью сохранены!

Решение для резервного копирования с использованием «SanDisk Memory Zone» для сохранения отметки времени. копирование/перемещение файлов с устройства Android на внешнюю SD-карту — протестировано на Samsung Note 2, Note 3 и Mini SIII

Просто создайте резервную копию ваших фотофайлов на SDCard и переместите карту на другое устройство Android, ПК, Apple или другое устройство — если вы не используете для резервного копирования свои фотофайлы, следуйте этим простым инструкциям из 8 шагов».

  1. Найдите в Google Play и установите «SanDisk Memory Zone».
  2. Запустите приложение и дождитесь завершения файла индекса.
  3. Выберите «Резервное копирование/восстановление» и измените или отметьте настройки.
  4. Выберите место назначения карты памяти и то, что нужно сохранить (контакты, смс, фотографии, музыку и т. д.).
  5. Проверьте требуемую и доступную емкость и нажмите кнопку ПРОДОЛЖИТЬ.
  6. Дождитесь завершения резервного копирования.
  7. Теперь у вас есть копия файлов на вашей SDCard в ".memoryzone_backup/files/1"
  8. Теперь вы можете перемещать файлы SD-карты, такие как фотографии, на свое устройство Windows, Linux или другое устройство Android, сохраняя исходную временную метку.
копирование файлов на внешние SD-карты не вызывает проблемы с отметкой времени модификации

Быстрое и простое решение: просто используйте ПК или Mac для копирования файлов со старой SD-карты (или ПК) на новую SD-карту. Используйте ПК/Mac с устройством чтения/записи SD-карт (существуют преобразователи USB-SD-карт), которое видит карту как USB-накопитель FAT32. Когда вы закончите копирование, снова вставьте новую карту в телефон и перезагрузите компьютер.

Я перешел на Moto X 2014 года, и у меня возникла эта проблема.

Я также пробовал много вещей, решение, казалось, было «Motorola Migrate» для синхронизации с WiFi двух телефонов (старый пряничный бэкфлип). В галерее все было хорошо (даже в деталях), но странно в файловом менеджере менялась дата, а через несколько часов даже в галерее показывалась дата переноса.

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

У меня Nexus 4, и у меня была такая же проблема с отметкой времени и фотографиями (действительно со всеми файлами).

Вот командные строки (с рутированным телефоном), которые я использовал благодаря сообщению об Ubuntu:

sudo apt-get install android-tools-adb

(в Ubuntu, если Android SDK не установлен)

adb devices
cd /media/my_backup_folder_where_i_put_a_folder_with_all_my_data_named_"savandroid"_in_it

Для того, чтобы зайти в мою папку "backup", которая содержит папку "savandroid"

adb root
adb push savandroid /sdcard

Все файлы и папки, которые находятся в «saveandroid», отправляются на SD-карту, все работает правильно, все временные метки правильные!

Примечание . В Cyanogenmod мне пришлось выбрать root для «приложений и adb» в меню разработчиков. По умолчанию он установлен только в приложениях.

Я добавлю свое решение, которое работало на Ubuntu

Сначала установите simple-mtpfs и установите предохранитель

cd ~
mkdir myphone
simple-mtpfs ~/myphone

Теперь у вас есть папки вашего телефона, смонтированные в этом каталоге, вы можете использовать rsync -tили cp -pкопировать изображения, и время создания/изменения/доступа не изменится.

Работай на меня :)

В терминале при монтировании с помощью simple-mtpfs временные метки отображаются как сохраненные. Но при доступе к файлам в телефоне временные метки вроде все сбрасываются.

Чтобы скопировать файлы с Android на компьютер с сохранением временных меток:

adb shell tar c -C /storage/emulated/0/XXX . | tar xv

Чтобы восстановить их обратно на Android:

tar c . | adb shell tar xv -C  /storage/emulated/0/XXX 

Это работает путем создания tar-файла на устройстве, который сразу же извлекается на вашем хосте, и наоборот.

«v» позволяет увидеть имя копируемого файла.

Конечно, это предполагает, что у вас установлен «adb», что на телефоне включена отладка по USB и что вы уже подтвердили сертификат отладки.

sudo apt install adb

Попробуйте приложение «Bluetooth File Transfer», оно сохраняет измененную дату при перемещении. И я верю, что с копированием тоже, но сначала попробуйте с одним файлом / папкой, чтобы убедиться. Он также может исследовать другое устройство через bluebooth.

Предоставление ссылки на приложения, которые вы рекомендуете, сделает этот ответ более полезным.

Используйте SyncMe Wireless и сетевой ресурс. Временные метки сохраняются, и синхронизация происходит быстро. Я смог выполнить резервное копирование без компьютера на SD-карту в Kingston MobileLite Wireless за 20 минут, мгновенная повторная синхронизация.

Можно ссылку на это приложение?
Я смог найти только ссылку на SyncMe Wireless , но не на «Общий доступ к сети», если вы на самом деле не имели в виду, что это одно приложение. Также предоставьте краткое описание приложения и шаги, чтобы сделать это, если это возможно.