Nexus 4不通过MTP显示文件

我试图简单地写一个简单的XML文件到SD卡,我注意到,我的Nexus 4确实写入文件,但它不能通过使用Windows 7的MTP协议查看。

码:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); CustomerQueryRqType customerQueryRequest = new CustomerQueryRqType(); Serializer serializer = new Persister(); File myFile = new File(Environment.getExternalStorageDirectory() + "/customerQueryRequest.xml"); try { boolean created = myFile.createNewFile(); serializer.write(customerQueryRequest, myFile); } catch (Exception e) { e.printStackTrace(); } } 

我可以用Astro文件pipe理器在手机上看到这个文件:

截图

但Windows没有看到它…:

截图

目录下的adb shell显示:

 ls -l drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Alarms drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Android drwxrwxr-x root sdcard_rw 2012-11-21 19:30 DCIM drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Download drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Movies drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Music drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Notifications drwxrwxr-x root sdcard_rw 2012-11-19 12:06 Pictures drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Podcasts drwxrwxr-x root sdcard_rw 2012-11-19 13:22 Ringtones drwxrwxr-x root sdcard_rw 2012-11-19 14:33 bluetooth -rw-rw-r-- root sdcard_rw 79 2012-12-05 22:26 customerQueryRequest.xml drwxrwxr-x root sdcard_rw 2012-11-20 02:50 data -rw-rw-r-- root sdcard_rw 11394 2012-11-19 13:54 eightpen_custom_gestures drwxrwxr-x root sdcard_rw 2012-11-19 13:17 media 

我的Nexus 4发生了什么? 为什么从Windows隐藏我的东西?

似乎是通过MTP影响Android USB文件访问的已知问题 。 MTPcaching过期,直到重新启动手机。

解决方法是:

  • 清除“媒体存储”应用程序的数据
  • 使用SDrescan或SD扫描仪 (也适用于Android 4.4 / 5,在F-Droid上可用)应用程序强制更新

或者完全避免使用USB。 这个问题不会影响其他访问文件的方法。 例如,尝试AirDroid传输文件。


注意:这不适用于Android 5.0.2:清除“媒体存储”并使用SD重新扫描程序后,这些文件夹将作为无法打开的4K文件出现在Windows 7中。 此时唯一的解决方法是再次清除介质存储并重新启动设备

closures文件后,您可以使用下面的代码

 MediaScannerConnection.scanFile(this, new String[] { file.getAbsolutePath() }, null, null); 

来源: https : //code.google.com/p/android/issues/detail?id = 38282

在Xperia Z下面的代码工作得很好:

  String screenShotFile = "...."; activity.sendBroadcast(new Intent( Intent.ACTION_MEDIA_MOUNTED, Uri .fromFile(screenShotFile))); 

对于4.4+使用:

 activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(screenShotFile))); 

(不幸的是,我不记得我是否已经testing过了)

http://commonsware.com/blog/2013/11/06/android-4p4-permission-regressions.html

花了几个小时后,我解决了这个问题:

 private void rescanFolder(String dest) { // Scan files only (not folders); File[] files = new File(dest).listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isFile(); } }); String[] paths = new String[files.length]; for (int co=0; co< files.length; co++) paths[co] = files[co].getAbsolutePath(); MediaScannerConnection.scanFile(activity, paths, null, null); // and now recursively scan subfolders files = new File(dest).listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isDirectory(); } }); for (int co=0; co<files.length; co++) rescanFolder(files[co].getAbsolutePath()); } 

事情是,你必须扫描文件 (不是文件夹),然后recursion重复每个fubfolder

编辑另外,如果你不想要图片被添加到你的相册(但只是你的内容出现在mtp协议),记得要重新扫描它之前,在您的文件夹中放置一个空的.nomedia文件,如下所示:

 new File(myFolder + File.separator + ".nomedia").createNewFile(); rescanFolder(myFolder); 

通知/存储/模拟。 Android 4.2有一些模拟每个应用程序/用户访问的东西,例如每个用户单独的/ sdcard /。 尝试将文件移动到/ sdcard /而不是显示的模拟SD卡。

提出质疑的简单代码如何刷新Android上的MediaStore? 如果在将文件放在外部存储上后调用,MediaStore会进行必要的更新。 我的Nexus 4上的内容在Windows 7文件浏览器中即时刷新。

我需要创build一个目录,并为我的应用程序复制一些示例文件。 经过大量的实验和研究,以下过程对我来说是完美无缺的:

1)使用File.mkdir()创build目录。

2)复制目录中的文件并在每个文件上运行MediaScanner。

 MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null, null); 

3)在目录上运行MediaScanner。

 MediaScannerConnection.scanFile(context, new String[]{directory.getAbsolutePath()}, null, null); 

结果:文件和目录在PC上通过MTP即时显示。

与我的OneplusOne有类似的问题:

软件更新(6.0.1版)后,连接到计算机(PTP和MTP)时无法看到相机图像。 这两个应用程序的SDRescan和SDscanner都没有效果。

我的解决scheme是使用terminal或电话上的任何文件资源pipe理器应用程序将所有图片从DCIM复制到另一个文件夹。 当连接到电脑时,我能够看到复制的文件..我把它们移到我的电脑,并清除我的相机文件夹。 没有永久性的解决scheme,但至less在我进行下一次备份之前,它为我解决了这个问题。 = d

我发现在接受的答案中提到的错误的最佳解决方法是使用SSH将数据从Android OS复制到另一台机器/服务器(Linux,MacOS,Windows)。

  • 确保设备(Android)和计算机(您要复制数据的位置)可通过IP或主机名访问,例如将其连接到同一个WiFinetworking。

可选和推荐

  • 使用USB共享连接Android设备。 由于有线连接,这确保了快速的速度,并确保两个IP地址彼此可见,因为两者在相同的networking中。

在Android设备上

  • 安装一个SSH服务器。 SSHelper像一个魅力工作
  • 运行SSHelper并转到configuration选项卡以获取IP地址,端口和密码。 在下面的例子中,它们是192.168.1.5,2222和'admin'。
  • 默认密码是admin,但如果您决定更改它,请在更改后按“使用新值重新启动服务器”button

在机器中

  • 安装rsync。 如果碰巧使用Ubuntu,它已经默认安装了。
  • 打开一个shell并input以下命令。 将IP地址和端口更改为您的值

rsync -avzhP --inplace --info=progress2 -e 'ssh -p 2222' 192.168.1.5:/storage/emulated/0/DCIM/Camera/ /home/username/path/to/pics/

  • 你会得到如下提示,input你的密码

SSHelper Version 8.5 Copyright 2014, P. Lutus Default password is "admin" (recommend: change it) username@192.168.1.5's password: admin receiving incremental file list

其他build议不适合我:

  • 设备不支持使用USB存储模式而不使用MTP(与许多其他较新的设备一样)。
  • 我的操作系统(Android 6.0.1)无法清除“媒体存储”应用程序数据。
  • 通过networking共享文件的其他方法有其缺点。 FTP不能确保文件的完整性。 如果连接被删除,它将覆盖或跳过所有文件,因此其中一个文件可能不完整。 其他协议可能很难安装,其他应用程序可能会使用专有协议。

上面的答案适用于创build文件。 如果您稍后删除该文件并希望更改也反映出来,则可以执行以下操作之一; 我们首先介绍看起来像是有效的两个解决scheme,但是会在某些设备上导致问题。 第一个是扫描删除的文件:

 context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file))); 

这可以在许多设备上删除文件,但在某些设备上,它会导致一个新的0字节的文件被创build,这可能不是你想要的。 在这种情况下,如果你运行<4.4 KitKat,你可以这样做:

 context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(folder))); 

哪里的文件夹等于file.getParentFile()。 不幸的是,在KitKat 4.4及以上版本中,这将导致抛出SecurityException,因此对于这些设备,您可以尝试直接从Media Store中删除:

 final Uri externalFilesUri = Files.getContentUri("external"); context.getContentResolver().delete(externalFilesUri, Files.FileColumns.DATA + "=?", new String[] {file.getAbsolutePath()}); 

我已经testing过这一个ACTION_MEDIA_MOUNTED不适用于KitKat的解决方法,它适用于我在Nexus 5上的testing。

最近我面临同样的问题,但一些额外的研究帮助find隐藏的文件。 Google似乎在存储结构上做了一些改变。 所有这些文件被移动到另一个文件夹This Computer\HTC One\Internal Storage\storage\emulated\0 。 但奇怪的是并不是所有的文件都被移动了。

Android 4.4.2