在 Android 上添加的文件夹无法通过 USB 显示

Folder added on Android is not visible via USB

提问人:eje211 提问时间:11/22/2012 最后编辑:Peter Mortenseneje211 更新时间:10/9/2020 访问量:33026

问:

我正在尝试将图片保存在 Android 上的子文件夹中。这是我的一些代码:

File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
path = new File(path, "SubDirName");
path.mkdirs();

(我试过用图片文件夹代替DCIM。getExternalStorageDirectorygetExternalStoragePublicDirectory

当设备通过 USB 连接时,我添加的任何子文件夹(包括其内容)都不会显示在 Windows 资源管理器中。不过,它确实显示在 Android 文件管理器中。

我尝试在新目录的父目录上广播意图。它没有用。ACTION_MEDIA_MOUNTED

如果我在 Windows 中添加文件,它会显示在 Android 上。如果我通过文件管理器在 Android 上添加文件,它会显示在 Windows 中。如果我以编程方式添加文件,它会显示在 Android 文件管理器中,但不会显示在 Windows 资源管理器中。我需要从 Windows 获取它,我不希望最终用户必须手动创建文件夹。

我做错了什么?

Android 文件系统

评论

2赞 PC. 11/22/2012
我也在三星设备中看到了这种行为。您的代码没有问题。这是三星USB驱动程序的行为。再次插入并插入 USB,目录将开始显示。
1赞 eje211 11/22/2012
谢谢你的建议,PC。我也想到了这一点。不过,这是华硕变形金刚。我尝试拔出并重新插入,但没有用。
1赞 PC. 11/22/2012
如果文件夹在Android文件管理器中可见,那么在我看来是USB的问题,而不是您的代码问题。
1赞 kittu88 11/22/2012
您必须使用 getExternalStoragePublicDirectory,否则它将在设备外部不可用。
3赞 Hades 4/3/2013
问题出在MTP协议上......只需重新启动手机,它就会显示出来

答:

0赞 ehabth 6/11/2013 #1

如果通过读卡器将文件夹从 PC 直接添加到卡的 SD 卡中,则与手机连接时不会显示在 Windows 资源管理器中。

解决方案是使用Android文件管理器程序复制或移动相同的文件夹,然后在连接到PC时将其列在SD卡索引中。

62赞 Baschi 11/13/2013 #2

我遇到了同样的问题,重新启动Android设备或PC对用户来说不是一个实用的解决方案。:)

这个问题是通过使用 MTP 协议(我讨厌这个协议)。你必须 启动对可用文件的重新扫描,您可以使用以下类执行此操作:MediaScannerConnection

// Snippet taken from question
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
path = new File(path, "SubDirName");
path.mkdirs();

// Initiate a media scan and put the new things into the path array to
// make the scanner aware of the location and the files you want to see
MediaScannerConnection.scanFile(this, new String[] {path.toString()}, null, null);

评论

9赞 Sheraz Ahmad Khilji 4/8/2014
非常感谢,这是一个很好的解决方法......我想为此杀死谷歌。每当将某些内容写入磁盘时,这应该自动完成。我希望谷歌能尽快解决这个问题
1赞 Miral Sarwar 10/3/2015
感谢您的文件扫描想法。
1赞 JamisonMan111 3/18/2018
我认为答案是 Android 关心那些想要将文件保密的大钱应用程序制造商,而且也更容易更安全......话虽如此,毫不奇怪,困难被转嫁给我们来吸收,因为这是 Android 最好/最容易的
1赞 Top Systems 5/15/2019
@SherazAhmadKhilji 2019 年,尚未:)
0赞 David Callanan 12/31/2019
我希望这有效,每次都重新启动我的设备是不可行的。
5赞 raziEiL 6/8/2015 #3

Baschi 的回答中使用的方法并不总是对我有用。好吧,这是一个完整的解决方案。

// Snippet taken from question
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
path = new File(path, "SubDirName");
path.mkdirs();

// Fix
path.setExecutable(true);
path.setReadable(true);
path.setWritable(true);

// Initiate media scan and put the new things into the path array to
// make the scanner aware of the location and the files you want to see
MediaScannerConnection.scanFile(this, new String[] {path.toString()}, null, null);

评论

1赞 lfurini 6/8/2015
只是一点评论:与其说这种方式有时对我不起作用,不如说 [Baschi 提出的解决方案](stackoverflow.com/a/19934089/4453460)有时对我不起作用(只是为了更清楚)。
-1赞 Abdullah Kms 8/5/2016 #4

我已经通过切换手机设置解决了这个问题:

  1. 创建目录和/或保存文件后,暂时从(MTP)模式更改为USB(SD卡)模式,等待SD卡安装在PC上,以便显示目录和文件。

  2. 再次返回 (MTP) 模式,最后一个文件仍显示。

  3. 重新保存文件时,您必须再次更改为 USB 才能看到它。

3赞 Luigi04 9/10/2016 #5

唯一对我有用的是:

Intent mediaScannerIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri fileContentUri = Uri.fromFile(path);
mediaScannerIntent.setData(fileContentUri);
this.sendBroadcast(mediaScannerIntent);

归功于 https://stackoverflow.com/a/12821924/1964666

-2赞 2PeteShakur 11/3/2017 #6

只需先在PC上创建目录,然后将其复制到SD卡/手机存储中即可。

您可以先将内容放入文件夹中并复制,也可以先将文件夹放入文件夹。只要从PC创建文件夹,任何内容都可以直接复制到内部/外部移动设备。对于压缩的内容,不幸的是,它不能直接解压缩和复制;您需要先解压缩它们。

0赞 Andrii Chemer 1/17/2020 #7

这对我来说很好。

如果目录(不是目录)中有文件,则 MediaScannerConnection.scanFile 有效

private fun checkMTPFolder(f: File, context: Context) {
   if (f.isDirectory) {
      val newFilePath = f.absolutePath + "/tempFIle"
      val newFile = File(newFilePath)
      newFile.mkdir()

      MediaScannerConnection.scanFile(context, arrayOf(newFilePath), null, object : MediaScannerConnection.OnScanCompletedListener {
                override fun onScanCompleted(p0: String?, p1: Uri?) {
                    val removedFile = File(p0)
                    removedFile.delete()
                    MediaScannerConnection.scanFile(context,arrayOf(removedFile.absolutePath), null, null)
                }

            })
   }
}
1赞 Daniil Andashev 10/9/2020 #8

以上都没有帮助我,但这奏效了: 诀窍是不要扫描新文件夹,而是在新文件夹中创建一个文件,然后扫描该文件。现在,Windows 资源管理器将新文件夹视为 true 文件夹。

    private static void fixUsbVisibleFolder(Context context, File folder) {
    if (!folder.exists()) {
        folder.mkdir();
        try {
            File file = new File(folder, "service.tmp");//workaround for folder to be visible via USB
            file.createNewFile();
            MediaScannerConnection.scanFile(context,
                    new String[]{file.toString()},
                    null, (path, uri) -> {
                        file.delete();
                        MediaScannerConnection.scanFile(context,
                                new String[]{file.toString()} ,
                                null, null);
                    });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

感谢 https://issuetracker.google.com/issues/37071807#comment90

您还应该以类比方式扫描目录中每个创建的文件:

   private static void fixUsbVisibleFile(Context context, File file) {
    MediaScannerConnection.scanFile(context,
            new String[]{file.toString()},
            null, null);
}