Nexus4没有通过 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 文件管理器看到手机上的文件:

Screenshot

但是 Windows 没有看到... ..:

Screenshot

目录中的 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

我的 Nexus4怎么了? 为什么它把我的东西藏起来不让 Windows 看到?

67592 次浏览

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

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

解决办法是:

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

或者干脆别用 USB。该问题不会影响其他访问文件的方法。例如,尝试 AirDroid传输文件。


注意: 这不适用于 Android 5.0.2: 在清除“媒体存储”并使用 SD 重新扫描仪后,文件夹在 Windows 7中显示为不可打开的4K 文件。此时唯一的解决方案是再次清除“媒体存储”并重新启动设备

如果在我将文件放到外部存储器后调用,那么提出问题 如何在 Android 上刷新 MediaStore?的简单代码会对 MediaStore 进行必要的更新。在 Windows7文件资源管理器中,我的 Nexus4上的内容会立即刷新。

在 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)));

(不幸的是,我不记得我是否测试得足够好)

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

您可以在文件关闭后使用以下代码

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

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

上面的答案对于创建文件很有用。如果您稍后删除该文件并希望同时反映该更改,则可以执行下列操作之一; 让我们首先介绍两种看似可行但在某些设备上会引起问题的解决方案。第一个是扫描被删除的文件:

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

这种方法适用于许多已删除文件的设备,但是在某些设备上,它实际上会创建一个新的0字节文件,这可能不是您想要的。在这种情况下,如果你使用的是 < 4.4 KitKat,你可以这样做:

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

其中文件夹等于 file.getParentFile ()。遗憾的是,在 KitKat 4.4及以上版本中,这将导致一个 SecurityException 被抛出,因此对于这些设备,您可以尝试直接从媒体商店中删除:

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

我已经测试过这个,作为 ACTION _ MEDIA _ MOUNTED 不在 KitKat 上工作的解决方案,它在我在 Nexus 5上的测试中起作用。

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

安卓4.4.2

在花了几个小时研究这个问题之后,我这样解决了:

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());
}

问题是,你必须扫描 只提供档案(而不是文件夹) ,然后递归地重复每个 fubfile

剪辑 另外,如果你不希望图片被添加到你的相册中(只是你的内容出现在 mtp 协议中) ,记得在重新扫描它之前在你的文件夹中放一个空的 .nomedia文件,像这样:

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

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

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

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

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

3)在目录中运行 MediaScanner。

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

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

我的 OneplusOne 也有类似的问题:

软件更新后(6.0.1)我不能看到我的照相机图片时,连接到计算机(PTP 和 MTP)。应用程序的 SDRescan 和 SDscanner 都没有效果。

我的解决方案是复制所有图片从 DCIM 到另一个文件夹使用终端或任何文件浏览器应用程序的电话。当连接到计算机时,我能够看到复制的文件。.我把它们移到我的电脑上,清空了我的相机文件夹。没有永久的解决方案,但它为我修复了问题,至少直到我做下一个备份。= D

针对 接受的答案中提到的 bug,我发现最好的解决办法是使用 SSH 将数据从 Android OS 复制到另一台机器/服务器(Linux、 MacOS、 windows)。

  • 确保设备(Android)和机器(您想要复制数据的地方)可以按 IP 或主机名访问,例如通过将它们连接到相同的 wifi 网络。

可供选择和推荐

  • 使用 USB 连接连接机器人设备。由于有线连接,这确保了快速的速度,并保证两个 IP 地址对彼此都是可见的,因为它们都在同一个网络中。

在 Android 设备里

  • 安装一个 SSH 服务器
  • 运行 SSHelper 并转到配置选项卡以获取 IP 地址、端口和密码。在下面的示例中,它们是192.168.1.5、2222和“ admin”。
  • 默认密码是 admin,但如果您决定更改它,请在更改后点击“ Restart server with new value”按钮

在机器里

  • 安装 rsync。如果正好使用 Ubuntu,默认情况下它已经安装了。
  • 打开 shell 并键入以下命令。将 IP 地址和端口更改为您的值

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

  • 您将得到以下提示,输入您的密码

SSHelper Version 8.5版权所有2014,P. Lutus 默认密码是“ admin”(建议: 更改) Username@192.168.1.5的密码: admin 接收增量文件列表

其他的建议对我不起作用:

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

从文档 给你中,您需要调用 MediaScanerConnection.ScanFile:

// Tell the media scanner about the new file so that it is
// immediately available to the user.
MediaScannerConnection.scanFile(this,
new String[] { file.toString() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});