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