28 votes

Comment puis-je transférer des photos vers mon appareil Android Jelly Bean tout en préservant la date et l'heure d'origine?

J'ai récemment acheté un Nexus 4 et j'aimerais transférer mes photos de mon appareil précédent vers celui-ci. Mon ancien téléphone Android utilisait le stockage de masse USB standard, ce qui ne posait aucun problème pour copier des fichiers, mais le Nexus 4, comme de nombreux autres téléphones Android modernes je suppose, utilise plutôt le MTP, qui a la particularité intéressante de refuser de copier les dates/heure originales des fichiers, utilisant à la place la date à laquelle les fichiers sont copiés.

C'est évidemment très embêtant quand il s'agit de photos; non seulement parce qu'on ne peut pas vérifier la date d'origine à laquelle la photo a été prise en naviguant sur le téléphone, mais aussi parce qu'elles se retrouvent complètement désordonnées.

Existe-t-il un moyen de transférer des photos vers un téléphone Android Jelly Bean qui ne prend pas en charge le stockage de masse USB en préservant les horodatages d'origine ?

Les choses que j'ai essayées jusqu'à présent :

  • Transfert via USB MTP
  • ADB push (à la fois des dossiers complets et des fichiers individuels)
  • Transfert via SSH (en utilisant SSHDroid + WinSCP)
  • Téléchargement et téléchargement depuis Dropbox
  • Transfert d'un fichier ZIP via MTP et décompression du fichier sur le téléphone
  • Transfert depuis l'autre téléphone via Bluetooth

Aucun d'entre eux n'a préservé l'horodatage, et cela me rend fou.

(De plus, je ne suis pas encore rooté, mais si le seul moyen viable nécessite un root, j'accueillerais également cette réponse.)

0 votes

Est-ce qu'Android prend en charge le détartrage des fichiers .tar? Si c'est le cas, peut-être pourriez-vous copier un fichier .tar des images. Je ne sais pas si le détartrage modifierait ou non la date et l'heure des fichiers individuels.

0 votes

@Chance a déjà essayé cela auparavant mais cela n'a pas aidé non plus ; le problème est que par défaut, rien n'a les privilèges pour écrire le timestamp, donc il n'y a rien à faire sauf rooter actuellement.

10voto

ce4 Points 14264

Vous ne pouvez pas, il s'agit d'un problème d'autorisation actuel (rapport de bug ici) du dossier /sdcard d'Android 4.0+ s'il n'utilise pas FAT32 (mais FUSE).

Raison : Il y a une transition loin de FAT32 vers un stockage utilisateur unifié pour à la fois les applications et les données multimédias (en utilisant ext4) sur un seul système de fichiers.

Nous en avons eu assez de voir des OEM inclure plusieurs Go de stockage interne pour la musique, alors que les utilisateurs manquaient toujours d'espace pour les applications et les données. Cette approche nous permet de fusionner tout sur un seul volume, ce qui est bien meilleur.

-- Dan Morrill, ingénieur Android chez Google

Les anciennes propriétés FAT32 sont émulées en utilisant une couche FUSE pour être compatibles avec les applications existantes. De plus : /data/ et /sdcard sur les appareils Google à partir du Nexus 7 utilisent une seule partition seulement (/data/media représente le contenu de la "sdcard" et est exposé aux applications en utilisant la couche FUSE).

Voici l'implémentation du pilote FUSE de CyanogenMod si vous êtes intéressé à voir la source. Il semble que le réglage des attributs de timestamp soit implémenté, cependant.

ÉDIT : Cela ne fonctionne qu'avec les droits root.

Raison exacte : Tous les fichiers sont possédés par root.sdcard_rw (voir ici).

Un appelant sans uid=0 ne peut pas appeler le syscall utimensat(), il échoue déjà au niveau de la VFS (EPERM) pour des horodatages autres que l'actuel :

  1. L'ID utilisateur effectif de l'appelant doit correspondre au propriétaire du fichier ; ou
  2. L'appelant doit avoir les privilèges appropriés.

Pour apporter toute modification autre que le réglage des deux horodatages à l'heure actuelle
(c'est-à-dire, times n'est pas NULL, et les deux champs tv_nsec ne sont pas
UTIME_NOW et les deux champs tv_nsec ne sont pas UTIME_OMIT), l'une des conditions
2 ou 3 ci-dessus doit s'appliquer.

0 votes

Merci pour les informations, espérons que c'est quelque chose que Google peut et serait prêt à résoudre, car à ce que je vois, le problème n'est pas la couche de fusible ou le protocole MTP, mais les privilèges stricts qui ont été définis, et qui semblent d'ailleurs être assez récents (4.2.1?) puisque l'application de correction de date de photo ci-dessous semblait fonctionner avec des appareils plus anciens basés sur fuse/mtp, tels que le galaxy nexus 4.0.

2 votes

Mise à jour pour les lecteurs futurs : ceci reste non corrigé dans 4.2.2.

2 votes

Mise à jour pour encore plus de futurs lecteurs : non corrigé dans Marshmallow 6.0.

6voto

BigDave Points 5649

Je suis récemment tombé sur ce problème sur un Nexus 5 et j'ai essayé la plupart des solutions répertoriées ici sans succès. Dans mon cas, il semble être causé par un bug reconnu avec Android de base (source).

Ma solution était la suivante - j'ai utilisé Windows 8.1, mais il n'y a aucune raison pour que cela ne fonctionne pas sur OSX/Linux (le root est cependant requis sur l'appareil).

  1. Sur votre PC, créez une archive .tar.gz de tous les fichiers que vous souhaitez transférer.

    • J'ai utilisé 7zip pour cela - Il convient de mentionner qu'avec Windows, vous devrez d'abord créer l'archive .tar, puis appliquer la compression .gz.
  2. Transférez l'archive sur l'appareil en utilisant FTP, en vous assurant d'utiliser la commande MFMT.

    • Sur le PC, j'ai utilisé Filezilla - vous devez vous assurer que Transférer > Préserver les horodatages des fichiers transférés est cochée.
  3. Sur l'appareil, extrayez l'archive dans un shell en tant que root.

    • En utilisant Terminal Emulator, assurez-vous d'abord d'avoir un accès root en utilisant la commande su. Vous devrez peut-être accorder l'accès si SuperSU s'affiche.
    • Naviguez jusqu'au répertoire contenant maintenant l'archive .tar.gz avec la commande cd par exemple: cd /sdcard/
    • Extrayez l'archive en utilisant la commande suivante: tar -xvf NOM_ARCHIVE_ICI.tar.gz
    • Remarque: Pour une raison quelconque, lorsque j'ai extrait directement vers le répertoire DCIM/Camera, les images n'apparaissaient pas du tout dans l'application de galerie par défaut. Si cela vous arrive, je vous suggère d'extraire vers un répertoire différent puis de déplacer (et non copier) les fichiers vers votre répertoire de caméra. Je soupçonne que cela est causé par un problème d'autorisations. Vous pouvez utiliser le terminal ou votre gestionnaire de fichiers préféré pour déplacer les fichiers.
  4. Redémarrez par mesure de précaution.

Cela a permis à tous les attributs 'date de modification' des fichiers de rester intacts et a laissé toutes les photos dans le bon ordre lorsqu'elles sont consultées dans l'application de galerie.

0 votes

Ils n'apparaissent pas dans la galerie en raison de l'index des médias. Il ne reconnaît pas votre opération de terminal mais si vous utilisez une application de gestionnaire de fichiers, il signale les nouveaux fichiers déplacés à l'index et maintenant ils sont à nouveau trouvés. Êtes-vous sûr que la partie ftp est vraiment nécessaire? Je me demande car le ftp ne peut pas modifier les fichiers qui sont à l'intérieur du tar, alors pourquoi cela serait-il important?

0 votes

@mgutt Je suppose que tu as raison concernant la partie FTP qui n'est pas nécessaire. J'ai rassemblé des morceaux d'information provenant d'autres solutions suggérées et c'est ce qui a fini par fonctionner pour moi!

4voto

Ronald Wildenberg Points 18258

Vérifiez les données EXIF et voyez s'il y a une horodatage là-bas.

S'il y en a un, Correction de la date de la photo vous permettra d'écraser l'horodatage erroné du fichier avec celui de l'EXIF, vous redonnant un tri correct.

0 votes

Rien. Les données EXIF sont là, et l'application a signalé avoir réussi à modifier les horodatages lorsque je l'ai utilisée, mais ils sont restés les mêmes ; j'ai redémarré et supprimé le cache de la galerie également, mais cela n'a pas aidé. L'application nécessite-t-elle un accès root ? Il semble qu'il y ait une sorte de protection en écriture sur les horodatages que rien ne peut surmonter.

4voto

Tomy Points 41

C'est une question qui me préoccupe beaucoup lorsque je rencontre des appareils qui n'ont que le mode MTP mais pas le mode de stockage de masse. J'ai aussi des préoccupations à ce sujet exactement pour les mêmes raisons que Mahn.

Après quelques tests, j'ai trouvé une solution temporaire qui pourrait peut-être préserver la date et l'heure de modification.

Il utilise la carte sd externe / lecteur de carte OTG ainsi que la commande cp avec -a, la date et l'heure de modification seront donc préservées. Mais l'exigence est que le téléphone doit être rooté.

  1. Copiez d'abord les données sur la carte SD.
  2. Lisez-les avec un lecteur de carte mémoire / carte OTG.
  3. Utilisez adb shell et obtenez la permission root (su).
  4. cp -a * les données de la carte vers la mémoire interne.

4voto

sarego Points 1150

Comme mentionné dans une autre réponse, sur les appareils qui utilisent FUSE pour l'émulation de la carte SD (comme les appareils Nexus modernes), seul le root peut modifier les horodatages des fichiers dans /sdcard. Puisque des choses comme MTP et ADB ne s'exécutent pas en tant que root, vous ne pouvez pas conserver les horodatages avec ces méthodes. Cependant, si votre appareil est rooté, vous pouvez corriger les horodatages avec une étape séparée par la suite.

En restaurant une sauvegarde complète de /sdcard depuis un PC Linux vers ma tablette, j'ai utilisé cette commande pour corriger tous les horodatages après avoir téléchargé les fichiers avec 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

Cela doit être exécuté depuis la racine du répertoire sur le PC qui correspond à /sdcard sur l'appareil. (Ou, si vous avez téléchargé autre chose qu'une sauvegarde complète de /sdcard, modifiez le chemin dans la commande touch vers la fin. Mais vous devriez exécuter ceci depuis le répertoire sur le PC qui correspond au répertoire dans la commande touch.)

La façon dont cela fonctionne est qu'elle parcourt tous les fichiers du côté PC, récupère l'horodatage de chacun, et exécute une commande touch en tant que root sur l'appareil pour définir l'horodatage du fichier correspondant là-bas.

Notez que cela exécutera une commande su séparée pour chaque fichier individuel. Si vous avez activé la journalisation dans votre programme root (par exemple, SuperSU), vous voudrez peut-être la désactiver pour éviter de produire un grand nombre d'entrées de journal. Et si vous avez configuré votre appareil pour demander une confirmation à chaque requête su, vous voudrez probablement changer cela temporairement. (Il est peut-être possible de trouver une variation qui redirige un flux de commandes touch dans un seul shell root sur l'appareil, mais la manière directe de le faire n'a pas fonctionné lorsque j'ai essayé, et je ne voulais pas y passer beaucoup de temps.)

J'ai utilisé cela avec succès sur un Nexus 10 fonctionnant sous Android 5.1.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X