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

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

是否可以将照片传输到Jel​​ly Bean Android不支持USB大容量存储并保留原始时间戳的手机?

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


通过USB MTP传输
ADB推送(完整文件夹和单个文件)
通过SSH传输(使用SSHDroid + WinSCP)
从Dropbox上载和下载
通过MTP传输ZIP文件并在手机上解压缩文件
通过蓝牙从另一部手机进行传输

QuickPic“修复日期”功能
本地同步
照片日期校正
FTPSyncX
烟雾信号
/>在电话里大吼大叫

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

(此外,我还没有扎根,但如果唯一可行的话方式需要root,我欢迎这个答案,因为好吧。)

评论

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

@Chance曾经尝试过,但是也没有帮助。问题在于,默认情况下,没有什么特权可以编写时间戳,因此,除了现在已经扎根,别无他法。

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

#1 楼

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

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


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

-Google的Android工程师Dan Morrill


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

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

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

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

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



调用者的有效用户ID必须与文件的所有者匹配;或
调用者必须具有适当的特权。

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


评论


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

–马恩
2012年12月22日,1:15

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

–马恩
13年2月20日在12:24

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

–马恩
2015年12月10日17:11

#2 楼

我最近在Nexus 5上遇到了此问题,并尝试了此处列出的大多数解决方案,但都没有碰到运气。就我而言,它似乎是由公认的Android股票库(来源)引起的。

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



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


我为此使用了7zip-在Windows上值得一提,您需要先创建.tar存档,然后再应用.gz压缩。



使用FTP将档案传输到设备,确保使用MFMT命令。



FTP Server在设备端支持MFMT。只需安装并启用,无需任何额外的配置。
在PC上,我使用了Filezilla-您需要确保选中“传输”>“保留已传输文件的时间戳”。



在设备上,将归档文件作为root提取到外壳程序中。


使用终端仿真器,首先确保使用su命令具有root用户访问权限。如果SuperSU弹出,则可能需要授予访问权限。
使用cd命令导航到现在包含.tar.gz存档的目录,例如:cd /sdcard/

使用以下命令提取存档:tar -xvf ARCHIVE_NAME_HERE.tar.gz

注意:由于某些原因,当我直接提取到DCIM/Camera目录时,图片根本不会显示在图库应用程序中。如果发生这种情况,建议您解压缩到其他目录,然后将文件移动(而不是复制)到相机目录。我怀疑这是由权限问题引起的。您可以使用终端或您选择的文件管理器移动文件。


重新启动可以很好地解决问题。

这允许所有文件“修改日期”属性保持完整,并在图库应用程序中查看时按正确的顺序保留所有照片。

评论


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

– mgutt
16年5月30日在16:28



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

– rmorrin
16年6月3日,9:20

#3 楼

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

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

评论


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

–马恩
2012年12月18日在19:04

#4 楼

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

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

使用外部sdcard / OTG读卡器以及带-a
的cp命令将可以保留时间戳。但是要求是手机必须扎根。


首先将数据复制到SDcard。
使用存储卡插槽/ OTG卡读取器读取它
使用adb Shell并获取root权限(su)
cp -a *从卡到内部存储器的数据。


#5 楼

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

从Linux PC还原/sdcard的完整备份到平板电脑时,我使用此命令修复了所有问题。使用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对应的PC目录的根目录运行。 (或者,如果您上传的不是完整的/sdcard备份文件,请在末尾更改touch命令中的路径。但是,您应该从PC上与touch命令中的目录相对应的任何目录中运行该路径。)

它的工作方式是遍历PC端的所有文件,获取每个文件的时间戳,并在设备上以root用户身份运行touch命令,以在该设备上设置相应文件的时间戳。 >
请注意,这将为每个文件运行一个单独的su命令。如果您在根程序(例如SuperSU)中启用了日志记录,则可能要禁用该功能以避免产生大量日志条目。而且,如果您将设备配置为对每个su请求提示进行确认,则可能需要临时更改此设置。 (可能可以提出一种变体,将touch命令流通过管道传输到设备上的单个根shell中,但是这样做的简单方法在我尝试时不起作用,并且我不想花了很多时间。)

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

#6 楼

我有完全一样的问题。似乎是在运行Stock JellyBean 4.2.1。的Nexus 4上的保险丝阻止了它。

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
从外观上看,如果不扎根手机就无法做到这一点。 />

评论


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

–龟
2012年12月21日,0:53



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

–马恩
2012-12-22在1:02



#7 楼

如果您使用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 /,然后从那里上传您的视频/照片。它会保留您计算机上的修改时间戳记,并且由于它已与设备同步,因此上传完成后,您会在应用程序中看到正确排序的照片。

#8 楼

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

评论


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

–马恩
2012年12月18日在19:08

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

– Izzy♦
2012-12-18 19:36



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

–马恩
2012年12月18日在20:51

我几乎打赌会的。我仍然记得那部分对开发人员有多艰辛-我们在Skype上坐了几个小时来讨论这个问题:) Windows上有一个丑陋的时间问题,有时会报告错误的情况...不会受伤吧?让我们知道结果如何...

– Izzy♦
2012年12月18日在21:12

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

–马恩
2012-12-20 9:33



#9 楼

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


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

打气.. :)

它保留了修改日期。
我不知道Droid Explorer是如何做到的。
但它只能工作。
/>
请确保在使用Droid Explorer之前检查USB调试。

..虽然有一个限制。.
Droid Explorer只能传输文件,不能传输文件夹。


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


评论


Droid Explorer需要ROOT,不是吗?

– AntonK
2014年6月23日在16:28



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

– mgutt
16年5月30日在20:41

#10 楼

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

评论


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

– mgutt
16年5月30日在16:47

#11 楼

我使用MTP在Android设备上复制文件时保留修改日期的解决方案:

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


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

看到,修改日期已完全保留!

#12 楼

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

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


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


评论


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

– AntonK
2014年6月23日下午16:37

#13 楼

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

#14 楼

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

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

解决方法,如果文件不是太多,可以手动一个接一个地复制,每次在电话上更改日期和小时。

#15 楼

我有一个Nexus 4,但在时间戳和照片(确实是所有文件)上也遇到了同样的问题。

由于在Ubuntu:

sudo apt-get install android-tools-adb


(如果未安装Android SDK,则在Ubuntu上)

adb devices
cd /media/my_backup_folder_where_i_put_a_folder_with_all_my_data_named_"savandroid"_in_it


在包含“ savandroid”文件夹的“ backup”文件夹中

adb root
adb push savandroid /sdcard

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

#16 楼

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

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

cd ~
mkdir myphone
simple-mtpfs ~/myphone


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

为我工作:)

评论


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

– Teresa e Junior
18年5月1日在11:14



#17 楼

要将文件从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文件来工作,该tar文件可以立即在主机上提取,反之亦然。

“ v”可以让您看到要复制的文件的名称。

当然,这是假设您已安装“ adb”,电话已启用USB调试并且您已经验证了调试证书。

sudo apt install adb


#18 楼

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

评论


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

–eldarerathis
15年4月19日在23:52

#19 楼

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

评论


您可以连结这个应用程式吗?

–马修·雷德(Matthew Read)
2015年6月14日15:55

我只能找到SyncMe Wireless的链接,而找不到“网络共享”的链接,除非您实际上是说这是一个应用程序。如果可能,还提供该应用程序的简短摘要以及执行此操作的步骤。

–安德鲁·T。♦
15年6月26日在1:20