MediaScannerConnection#scanFile 在 Android 5 Lollipop 上使用 USB-MTP 访问目录时将目录转换为文件

MediaScannerConnection#scanFile converts directories into files when accessing them with USB-MTP on Android 5 Lollipop

由应用程序触发的重命名文件等更改仅在 Android 设备 注册新文件后重新启动后才会出现在 USB-MTP 界面上MediaScanner 像这样(参见 Trigger mediascanner on specific path (folder), how to?):

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

USB-MTP 用于通过 USB 访问 android 设备的存储。例如。使用 Windows 资源管理器。

但是, 与 Sony XPERIA Tablet Z (SGP321) 在 Android 5.0.2 (Build 10.6.A.0.454) 文件夹中提供newFile会变成一个4KB的文件。我无法再使用 Windows Explorer 访问文件夹结构,也无法将文件复制到我的计算机。即使在平板电脑重启后!与 Android 4.4.4 相同的设备不显示该行为。似乎只有 USB-MTP 视图损坏了。 android 应用程序访问的文件结构看起来仍然很好。

问题:此行为是错误还是我实施不正确?正确的实施方式是什么?

到目前为止我已尝试解决此问题:

  1. 我目前的解决方法是避免对目录使用 scanFile
  2. 我可以通过使用没有 MediaScannerConnection#scanFile 的 android 应用重命名文件来将文件转换回目录。重新启动后,我可以再次使用 Windows 资源管理器访问该目录。
  3. 使用 Windows 资源管理器重命名实际上是目录的文件不会恢复它们。即使重启后。
  4. 中建议的这一行 不刷新 USB-MTP 视图,也不转换目录 进入文件:

    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                Uri.fromFile(newFile.getParentFile()));
    
  5. 可能相关:

    • 使用内容解析器进行各种文件操作,例如在此答案中删除文件:Android Deleting Files MediaScannerConnection

我最终在每个要显示的目录中创建了一个虚拟文本文件,并对文件使用了 scanFile。

1) 创建目录,但不要 "scan" 目录

2) 复制文件到目录

3) 运行 文件路径上的 scanFile

MediaScannerConnection.scanFile (_application, new String[] { filePath }, null, null);