如何在保留原始时间戳的同时将照片传输到Android Jelly Bean设备?


25

我最近购买了Nexus 4,并希望将以前设备的照片传输到该设备上。我以前的Android手机使用的是标准USB大容量存储,来回​​复制内容时出现了0个问题,但Nexus 4就像我猜想的许多其他现代Android手机一样,使用的是MTP,它具有拒绝复制原始内容的有趣功能。文件的日期/时间戳,而不是使用文件复制的日期。

当涉及到照片时,这显然是一个巨大的负担。不仅是因为无法在手机上浏览时查看照片的原始拍摄日期,还因为它们最终完全没有排序。

有没有办法将照片传输到不支持USB大容量存储并保留原始时间戳的Jelly Bean Android手机?

到目前为止我尝试过的事情:

  • 通过USB MTP传输
  • ADB推送(完整文件夹和单个文件)
  • 通过SSH传输(使用SSHDroid + WinSCP)
  • 从Dropbox上载和下载
  • 通过MTP传输ZIP文件并在手机上解压缩该文件
  • 通过蓝牙从其他手机传输
  • QuickPic “修复日期”功能
  • 本地同步
  • 照片日期校正
  • FTPSyncX
  • 烟火信号
  • 电话大吼

他们都没有保留时间戳,这让我发疯。

(此外,我还没有扎根,但是如果唯一可行的方法需要扎根,我也欢迎您回答。)


Android是否支持解压缩.tar文件?如果是这样,也许您可​​以复制图片的.tar文件。我不知道解压缩是否会更改单个文件的时间戳。
机遇

@Chance曾经尝试过,但是也没有帮助;问题是,默认情况下没有任何特权可以编写时间戳,因此,除了立即生根,其他任何事情都无法做。
Mahn 2012年

另外,对于所有对此问题感兴趣的人:谢谢。SE网站的工作方式我只能接受一个答案,但是这里的每个答案都以某种或其他方式有所帮助。
Mahn 2012年

Answers:


10

您不能,如果不是使用FAT32(而是FUSE),这是Android 4.0+的/ sdcard文件夹的当前权限问题(此处bugreport)。

原因:在单个文件系统上,应用程序和媒体数据(使用ext4)从FAT32过渡到统一用户存储。

我们已经厌倦了看到OEM拥有许多GB的内部音乐存储空间,而用户仍然没有足够的空间来存储应用程序和数据。这种方法使我们可以将所有内容合并到一个卷中,这更好。

-Google的Android工程师Dan Morrill

使用FUSE层模拟旧的FAT32属性,以与现有应用程序兼容。另外:从Nexus 7开始的Google设备上的/ data /和/ sdcard仅使用单个分区(/ data / media代表“ sdcard”内容,并通过FUSE层显示给应用程序)。

如果您有兴趣查看源代码,请参见CyanogenMod的FUSE驱动程序实现。不过,看起来设置时间戳属性已实现。

编辑:它仅适用于root用户。

确切原因:所有文件均由root.sdcard_rw拥有(请参阅此处)。

没有uid = 0的调用者无法调用utimensat()syscall,它已在VFS层中失败(EPERM)以获得当前时间戳以外的时间戳:

  1. 呼叫者的有效用户ID必须与文件所有者匹配;要么
  2. 呼叫者必须具有适当的特权。

除了将两个时间戳都设置为当前
时间(即,times不为NULL,并且两个tv_nsec字段都不为
UTIME_NOW且两个tv_nsec字段都不为UTIME_OMIT)以外,要进行其他任何更改,都
必须满足上述条件2或3。


感谢您提供的信息,我们希望这是Google可以并且愿意解决的问题,因为据我所知,问题不在于保险丝层或mtp协议,而是在那里设置的严格特权,由这种方式似乎是最近的(4.2.1?),因为下面发布的照片​​日期校正应用程序似乎确实适用于较旧的基于4.0保险丝/ mtp的设备,例如银河系。
Mahn 2012年

2
为将来的读者更新:在4.2.2中未解决此问题。
Mahn

2
面向更多未来读者的更新:6.0棉花糖未修复。
Mahn 2015年

6

我最近在Nexus 5上遇到了这个问题,并尝试了此处列出的大多数解决方案,但都没有碰到运气。就我而言,这似乎是由于Android的已知错误(来源)引起的。

我的解决方案如下-我使用Windows 8.1,但是没有理由在OSX / Linux上不起作用(但是设备上需要root)。

  1. 在您的PC上,为要传输的所有文件创建一个.tar.gz存档。

    • 我为此使用了7zip-在Windows上值得一提,您需要先创建.tar存档,然后再应用.gz压缩。
  2. 使用FTP将档案传输到设备,确保使用MFMT命令。

    • FTP服务器 在设备端支持MFMT。只需安装并启用,无需额外配置。
    • 在PC上,我使用了Filezilla-您需要确保选中“ 传输”>“保留已传输文件的时间戳”
  3. 在设备上,将归档文件作为根文件提取到外壳程序中。

    • 使用Terminal Emulator,首先使用su命令确保您具有root用户访问权限。如果SuperSU弹出,则可能需要授予访问权限。
    • 使用cd命令导航到现在包含.tar.gz存档的目录,例如: cd /sdcard/
    • 使用以下命令提取存档: tar -xvf ARCHIVE_NAME_HERE.tar.gz
    • 注意:由于某些原因,当我直接提取到DCIM/Camera目录时,图片根本不会显示在stock gallery应用程序中。如果您遇到这种情况,建议您解压缩到其他目录,然后文件移动(而不是复制)到相机目录。我怀疑这是由权限问题引起的。您可以使用终端或所选的文件管理器移动文件。
  4. 重新启动以采取适当措施。

这样可以使所有文件的“修改日期”属性保持不变,并且在图库应用中查看时,所有照片均以正确的顺序排列。


由于媒体索引的原因,它们没有出现在图库中。它无法识别您的终端操作,但是如果您使用文件管理器应用程序,它将向索引中报告新移动的文件,现在可以再次找到它们。您确定确实需要ftp部分吗?我想知道,因为ftp无法更改tar内部的文件,所以为什么这很重要?
mgutt '16

@mgutt我想您是正确的,不需要FTP部分。我把其他建议解决方案中的信息拼凑在一起,这才对我有用!
rmorrin

4

检查EXIF数据,看看那里是否有时间戳。

如果有的话,“ 照片日期校正”将使您可以使用EXIF覆盖装满文件的时间戳,从而使您恢复正确的排序。


没有。EXIF数据在那里,据报告该应用程序成功更改了我使用时的时间戳,但它们保持不变。我重新启动并删除了图库的缓存,但这没有帮助。该应用程序是否需要root用户?似乎在时间戳上存在某种写保护,无法克服。
Mahn 2012年

4

当遇到仅具有MTP而没有大容量存储模式的设备时,这确实使我感到非常困扰。我也对此感到担忧,原因与Mahn完全相同。

经过一些测试,我找到了一个临时解决方案,也许可以保留时间戳。

它使用外部sdcard / OTG读卡器以及带有-a的cp命令(可以保留时间戳)。但要求是电话必须扎根。

  1. 首先将数据复制到SD卡。
  2. 用存储卡插槽/ OTG读卡器读取
  3. 使用adb shell并获取root权限(su)
  4. cp -a *从卡到内部存储器的数据。

4

如另一个答案所述,在使用FUSE进行SD卡仿真的设备(例如现代的Nexus设备)上,只有root用户才能更改中的文件时间戳/sdcard。由于MTP和ADB之类的内容不是作为root用户运行的,因此您无法使用这些方法保留时间戳。但是,如果设备已植根,则可以在以后的单独步骤中修复时间戳。

/sdcard从Linux PC 还原到我的平板电脑的完整备份时,在使用以下命令上传文件后,我使用此命令修复了所有时间戳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

这应该从PC /sdcard上与设备相对应的目录的根目录运行。(或者,如果上载的文件不是完整/sdcard备份,则在touch末尾更改命令中的路径。但是,应从PC上与该touch命令目录相对应的任何目录中运行该路径。)

它的工作方式是遍历PC端的所有文件,获取每个文件的时间戳,然后touch以root用户身份在设备上运行命令以在此处设置相应文件的时间戳。

请注意,这将为su每个单独的文件运行一个单独的命令。如果您在根程序(例如SuperSU)中启用了日志记录,则可能要禁用该日志记录,以避免产生大量日志条目。而且,如果您将设备配置为对每个su请求都提示您进行确认,则可能需要临时更改此设置。(可能会提出一种变体,将touch命令流通过管道传输到设备上的单个根shell中,但是当我尝试这样做的时候,这种简单的方法却行不通,而且我不想花很多钱。很多时间。)

我在运行Android 5.1的Nexus 10上成功使用了该功能。


2

我有完全一样的问题。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 shell会话获取的;我认为所有应用程序级帐户将使用保险丝。

TL; DR 从外观上看,如果不扎根手机就无法完成。


1
我目前的“解决方案”是按时间顺序一次从过去的手机上载图片,并在其他目录之间进行暂停。这是我正在使用的Linux Shell脚本:[old_pictures]$ for f in $(ls -1 * | sort -t _ -k 2); do adb push $f /storage/sdcard0/DCIM/Past/; sleep 3; done; 如果您选择这种方式,请首先进行测试上传,以确保您满意。此外,在使用Google+即时上传功能时,请禁用它,以免出现“双重上传”的情况。
Turtle

谢谢,有帮助;作为您的for脚本:在我的情况下,在前一千个文件之后,通过Windows的mtp和adb都为我断开了连接,再加上一些文件随机损坏,您是否看到了相同的内容?基本上是此问题在这里描述的:code.google.com/p/android/issues/detail? id=35185(也许我应该提出一个单独的问题,因为这与时间戳本身并不直接相关。不过,我会喜欢mtp)
Mahn 2012年

2

如果您使用Google Photo应用程序,并且希望以正确的顺序列出文件,则可以找到解决方案。

问题的背景

这是一个Android Bug。它不允许非root用户更改文件的修改日期(https://code.google.com/p/android/issues/detail?id=18624,因为引入了具有FUSE文件系统的多用户/沙箱) 。并且在使用MTP协议(https://code.google.com/p/android/issues/detail?id=92635)复制文件时,不会保留时间戳。

针对Google Photo用户的解决方法

如果有照片,将使用EXIF信息对照片进行订购,因此您可以使用任何方式为照片设置正确的EXIF数据。任何相机都应该为您自动设置此项,只需确保其中的日期/时间正确即可。

对于视频,或者如果您不想设置EXIF数据,请访问https://photos.google.com/,然后从此处上传视频/照片。它会保留您计算机上的修改时间戳记,并且由于它已与设备同步,因此在您完成上传后,您会在应用程序中看到正确排序的照片。


1

使用诸如FolderSync之类的同步工具,该工具应相应注意时间戳。同步工具应该专门用于处理真正维护同步副本的所有方面-当然包括时间戳。


我尝试了几种同步工具,但没有一个同步时间戳,因为我猜有某种保护。谢谢你的回答。
Mahn 2012年

您尝试过FTPSyncX试用版吗?也许不是最精致的外观(开发人员不是设计师)。但是我已经使用Pro大约一年了,它可以通过SFTP / SSH(我使用的唯一协议,该应用可以处理更多协议)同步时间戳。
伊齐

我会检查一下,但是考虑到SSHDroid不适用于我,我想我也不会获得它的时间戳。
Mahn 2012年

我几乎打赌会的。我仍然记得那部分对开发人员有多难-我们在Skype上坐了几个小时来讨论这个问题:) Windows上有一个丑陋的时间问题,有时会报错...哦,OT :)只需尝试一下,不会受伤吧?让我们知道它是如何工作的……
伊兹

没有。FTPSyncX试用版作为手机上的客户端,freeSSHd作为笔记本电脑上的服务器,我能够通过STP / SSH连接和同步文件,但是传输到手机上的图片的时间戳仍被覆盖到当前日期。
Mahn 2012年

1

保留NEXUS设备上修改的日期---无需根目录---

  • 从Android到PC:使用MTP
  • 从PC到Android:使用Droid Explorer

干杯.. :)

它保留修改日期。我不知道Droid Explorer是如何做到的。但这是可行的。

在使用Droid Explorer之前,请确保已选中USB调试。

嗯。虽然有一个限制。Droid Explorer仅可以传输文件,而不能传输文件夹。

  • 使用Droid Explorer,将文件复制到某些特定文件夹上的android手机中
  • 然后在android中使用文件管理器,将这些文件移动到我们想要的文件夹中,请勿使用复制,因为复制会更改修改日期,而剪切不会。

Droid Explorer需要ROOT,不是吗?
AntonK 2014年

@AntonK是Droid Explorer需要Root来保存时间戳。如果“根”不可用,它将覆盖日期:maxrev.de/…–
mgutt

1

通过USB连接手机时,请使用PTP而不是MTP。它对我有用,我使用连接到Ubuntu 14.04机器的Samsung Note 4。但是,作为PTP连接仅允许复制图片/图像。将文件(蓝牙,WIFI,文件管理器)复制到外部驱动器的所有其他方法都会更改日期。


我使用Windows 10和使用CM 12.1(Android 5.1.1)的Note 3进行了测试。我移动了文件(Windows允许保留的唯一方法),但是它没有保留时间戳。:(
mgutt

0

我的解决方案,用于在具有MTP的Android设备上复制文件期间保留修改日期:

在LG G2股票(无根),Andorid 4.4.2和HTC 1 M7,Andorid 4.4.2上进行了测试:

  1. 要在计算机上复制的文件夹的网络共享(Win 8)
  2. 使用SyncMe Wireless将文件从计算机复制到设备

据我所知,修改日期已完全保留!


0

使用“ SanDisk内存区域”保留时间戳日期的备份解决方案。将文件从Android设备复制/移动到外部SDCard-在Samsung Note 2,Note 3和Mini SIII上测试

只需将您的照片文件备份到SDCard并将卡移动到其他Android,PC,Apple或其他设备-如果不用于备份您的照片文件,请按照以下8条陡峭的说明进行操作”

  1. 在Google Play上搜索并安装“ SanDisk内存区”。
  2. 启动应用程序,然后等待索引文件完成。
  3. 选择备份/还原并更改或标记设置。
  4. 选择存储卡目的地以及要备份的内容(联系人,短信,照片,音乐等)。
  5. 验证所需容量和可用容量,然后继续使用CONTINUE botton。
  6. 等待备份完成。
  7. 现在,您在SDCard中的文件副本位于“ .memoryzone_backup / files / 1”上
  8. 现在,您可以将SD卡文件(例如照片)移动到Windows,Linux或其他保留原始时间戳的Android设备上。

将文件复制到外部SD卡不会引起修改时间戳的问题
AntonK 2014年

0

快速简便的解决方案:只需使用PC或Mac将文件从旧的SD卡(或PC)复制到新的SD卡。将PC / Mac与SD卡读/写器(有USB到SD卡转换器)一起使用,它将SD卡视为FAT32 USB存储设备。复制完成后,将新卡重新插入手机并重启。


0

我搬到Moto X 2014时遇到了这个问题。

我也尝试了很多事情,一个解决方案似乎是“ Motorola Migrate”以与WiFi两部手机(旧的姜饼后空翻)同步。在图库中,情况很好(即使在细节上也不错),但是奇怪的是,在文件管理器中,日期已更改,几个小时后,甚至图库也显示了转移日期。

如果文件不是太多,则可以通过手动方式逐个复制一份解决方法,每次更改电话上的日期和时间。


0

我有Nexus 4,但时间戳和照片(确实是所有文件)都存在相同的问题。

由于在Ubuntu上发表了一篇文章,这是我使用的命令行(带有root用户的电话):

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

为了进入我的文件夹“备份”,其中包含文件夹“ savandroid”

adb root
adb push savandroid /sdcard

所有时间戳正确的情况下,“ saveandroid”中的所有文件和文件夹都可以很好地发送到SD卡!

注意:在Cyanogenmod上,我必须在开发人员菜单中为“ apps and adb”选择root。默认情况下,仅在应用程序上设置。


0

我将添加适用于Ubuntu的解决方案

首先安装simple-mtpfs并安装保险丝

cd ~
mkdir myphone
simple-mtpfs ~/myphone

现在,您已经将电话文件夹安装在此目录中,可以使用rsync -tcp -p复制图片,并且创建/修改/访问的时间不会更改。

为我工作:)


在终端中,使用simple-mtpfs挂载时,时间戳显示为已保留。但是当访问手机中的文件时,时间戳似乎都已重置。
邓丽君E初中

0

要将文件从Android复制到PC并保持时间戳,请执行以下操作:

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

-1

尝试使用应用程序“蓝牙文件传输”,它可以保留移动的修改日期。我也相信复制,但请先尝试使用一个文件/文件夹以确保。它还可以通过bluebooth探索其他设备。


提供指向您推荐的应用程序的链接将使此答案更有用。
eldarerathis 2015年

-1

使用SyncMe Wireless和网络共享。时间戳会保留,并且同步很快。我能够在20分钟内无需计算机备份到金士顿MobileLite Wireless中的SD卡,即时重新同步。


您可以连结这个应用程式吗?
马修(Matthew)

我只能找到SyncMe Wireless的链接,但找不到“网络共享”的链接,除非您实际上是说这是一个应用程序。如果可能,还提供该应用程序的简短摘要以及执行此操作的步骤。
安德鲁·T。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.