28 votes

Comment puis-je transférer des photos sur mon appareil Android Jelly Bean tout en conservant l'horodatage d'origine ?

J'ai récemment acheté un Nexus 4 et je voudrais y transférer les photos de mon ancien appareil. Mon précédent téléphone Android utilisait le stockage de masse USB standard qui ne posait aucun problème pour copier des choses dans les deux sens, mais le Nexus 4, comme beaucoup d'autres téléphones Android modernes je suppose, utilise MTP à la place, qui a la caractéristique intéressante de refuser de copier les dates/horodatages originaux des fichiers, en utilisant à la place la date à laquelle les fichiers sont copiés.

C'est évidemment très regrettable lorsqu'il s'agit de photos, non seulement parce que l'on ne peut pas vérifier la date originale à laquelle la photo a été prise en naviguant sur le téléphone, mais aussi parce qu'elles se retrouvent complètement non trié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 conservant les horodatages originaux ?

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

  • Transfert via USB MTP
  • ADB push (dossiers complets et fichiers individuels)
  • Transfert via SSH (en utilisant SSHDroid + WinSCP)
  • Chargement et téléchargement à partir de Dropbox
  • Transférer un fichier ZIP via MTP et décompresser le fichier sur le téléphone
  • Transfert à partir de l'autre téléphone via Bluetooth
  • QuickPic Fonction "date fixe".
  • Synchronisation locale
  • Correction de la date de la photo
  • FTPSyncX
  • Signaux de fumée
  • Crier au téléphone

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 le Root, je me réjouirais également de cette réponse).

10voto

ce4 Points 14264

Vous ne pouvez pas, c'est un problème de permission actuelle ( rapport de bogue ici ) du dossier /sdcard d'Android 4.0+ s'il n'utilise pas FAT32 (mais FUSE).

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

Nous en avions assez de voir les équipementiers 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 tout fusionner sur un seul volume, ce qui est bien mieux.

-- Dan Morrill, ingénieur Android chez Google

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

Voici la version de CyanogenMod. mise en œuvre du pilote FUSE si vous êtes intéressé à voir la source. Il semble que la définition des attributs d'horodatage soit implémentée, cependant.

EDIT : Cela ne fonctionne qu'avec Root.

La raison exacte : Tous les fichiers appartiennent à Root.sdcard_rw (cf. ici ).

Un appelant sans uid=0 ne peut pas appeler la fonction utimensat() syscall il échoue déjà dans la couche VFS (EPERM) pour les timestamps autres que le courant :

  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 effectuer tout changement autre que la mise en place des deux horodateurs à la date actuelle.
temps (c'est-à-dire que times n'est pas NULL et que les deux champs tv_nsec ne sont pas
UTIME_NOW et les deux champs tv_nsec ne sont pas UTIME_OMIT), l'une ou l'autre condition
2 ou 3 ci-dessus doivent s'appliquer.

6voto

BigDave Points 5649

J'ai récemment rencontré ce problème sur un Nexus 5 et j'ai essayé la plupart des solutions listées ici, sans succès. Dans mon cas, il semble être causé par un bug reconnu avec le stock Android ( source ).

Ma solution a été la suivante : j'ai utilisé Windows 8.1, mais il n'y a aucune raison pour que cela ne fonctionne pas sous OSX/Linux (il faut cependant disposer d'une racine 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 est utile de mentionner que sous Windows, vous devrez d'abord créer l'archive .tar, puis appliquer la compression .gz.
  2. Transférez l'archive vers le dispositif en utilisant le FTP, en veillant à utiliser la commande MFMT.

    • Serveur FTP prend en charge MFMT du côté du dispositif. Il suffit de l'installer et de l'activer, sans configuration supplémentaire.
    • Sur le PC, j'ai utilisé Filezilla - vous devez vous assurer Transfert > Préserver l'horodatage des fichiers transférés est vérifié.
  3. Sur l'appareil, extrayez l'archive dans un shell en tant que Root.

    • Utilisation de Emulateur de terminal assurez-vous d'abord d'avoir l'accès Root en utilisant la commande su commande. Vous devrez peut-être autoriser l'accès si SuperSU s'affiche.
    • Naviguez vers le répertoire contenant maintenant l'archive .tar.gz avec la commande cd, par ex : cd /sdcard/
    • Extrayez l'archive en suivant les instructions suivantes : tar -xvf ARCHIVE_NAME_HERE.tar.gz
    • Note : Pour une raison quelconque, lorsque j'ai extrait directement à la DCIM/Camera les photos ne s'affichent pas du tout dans l'application galerie. Si cela vous arrive, je vous suggère d'extraire dans un autre répertoire, puis d'effectuer les opérations suivantes déplacer (pas de copie) des fichiers dans le répertoire de votre appareil photo. Je pense que cela est dû à un problème de permissions. Vous pouvez utiliser le terminal ou le gestionnaire de fichiers de votre choix pour déplacer les fichiers.
  4. Redémarrer pour faire bonne mesure.

Cela a permis à tous les attributs de "date de modification" des fichiers de rester intacts, et de laisser toutes les photos dans le bon ordre lorsqu'elles sont visualisées dans l'application Galerie.

4voto

Ronald Wildenberg Points 18258

Vérifiez les données EXIF et voyez s'il y a un horodatage.

Si c'est le cas, Correction de la date de la photo vous permettra de remplacer l'horodatage du fichier par celui de l'EXIF, ce qui vous permettra de retrouver un tri correct.

0 votes

Rien. Les données EXIF sont là, et l'application a déclaré 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, mais cela n'a pas aidé. L'application nécessite-t-elle un 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 ne disposent que du mode MTP mais pas du mode de stockage de masse. J'ai aussi des inquiétudes à ce sujet avec exactement les mêmes raisons que Mahn.

Après quelques essais, j'ai trouvé une solution temporaire qui permet peut-être de préserver l'horodatage.

Il utilise le lecteur de carte externe sdcard / OTG ainsi que la commande cp avec -a. l'horodatage pourra être conservé. Mais la condition est que le téléphone doit être rooté.

  1. Copiez d'abord les données sur la carte SD.
  2. Lisez-le avec un lecteur de carte mémoire / OTG
  3. utiliser le shell adb et acquérir 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 Root peut modifier les horodatages des fichiers dans le répertoire /sdcard . Puisque des choses comme MTP et ADB ne fonctionnent pas en tant que Root, vous ne pouvez pas préserver les horodatages avec ces méthodes. Cependant, si votre appareil est rooté, vous pouvez peut fixer les timestamps avec une étape distincte par la suite.

Lors de la restauration d'une sauvegarde complète de /sdcard d'un PC Linux à ma tablette, j'ai utilisé cette commande pour fixer 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

Cette opération doit être exécutée à partir de la racine du répertoire sur le PC qui correspond à /sdcard sur l'appareil. (Ou, si vous avez téléchargé quelque chose d'autre qu'une copie complète de l'enregistrement de l'appareil). /sdcard sauvegarde, modifiez le chemin dans le fichier touch vers la fin. Mais vous devez l'exécuter à partir du répertoire du PC qui correspond au répertoire de la commande touch commande.)

Le système fonctionne de la manière suivante : il passe en revue tous les fichiers du côté PC, récupère l'horodatage de chacun d'entre eux, et exécute un touch en tant que Root sur le périphérique pour y définir l'horodatage du fichier correspondant.

Notez que cela va exécuter un su pour chaque fichier individuel. Si la journalisation est activée dans votre programme racine (par exemple SuperSU), vous pouvez la désactiver pour éviter de produire un grand nombre d'entrées de journal. Et si votre appareil est configuré de manière à demander une confirmation à chaque fois qu'une commande su vous voudrez probablement changer cela temporairement. (Il est peut-être possible de trouver une variante qui achemine un flux de données de touch dans un seul shell Root sur le périphérique, mais la manière directe de le faire n'a pas fonctionné lorsque je l'ai essayé, et je n'ai pas voulu passer beaucoup de temps dessus).

Je l'ai utilisé avec succès sur une Nexus 10 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