【问题标题】:Folder added on Android is not visible via USB在 Android 上添加的文件夹通过 USB 不可见
【发布时间】:2012-11-10 13:28:52
【问题描述】:

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

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

(我试过用getExternalStorageDirectory 代替getExternalStoragePublicDirectory,用图片文件夹代替DCIM。)

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

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

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

我做错了什么?

【问题讨论】:

  • 我在三星设备中也看到过这种行为。你的代码没有问题。这是三星 USB 驱动程序的行为。再次拔出并插入USB,目录将开始显示。
  • 感谢您的建议,PC。我也这么想过。不过,这是华硕变压器。我试过拔掉再重新插入,但没有用。
  • 如果文件夹在 Android 文件管理器中可见,那么根据我的说法是它的 USB 问题而不是您的代码问题。
  • 您必须使用 getExternalStoragePublicDirectory 否则它将无法在设备外使用。
  • 问题出在 mtp 协议上...只需重启手机即可显示

标签: android filesystems


【解决方案1】:

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

解决方法是使用安卓文件管理程序复制或移动同一个文件夹,连接到PC后会在SD卡索引中列出。

【讨论】:

    【解决方案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);
    

    【讨论】:

    • 非常感谢这是一个很好的解决方法......我想为此杀死谷歌。每当有东西写入磁盘时,这应该自动完成。我希望 Google 尽快解决此问题
    • 感谢文件扫描的想法。
    • 我认为答案是,Android 关心那些希望将文件保密的大钱应用程序制造商,而且它也更容易更安全......话虽如此,不足为奇的是,困难在于传递给我们吸收,因为这对于 Android 来说是最好/最简单的
    • @SherazAhmadKhilji 2019 还没有:)
    • 我希望这行得通,每次重启我的设备是不可行的。
    【解决方案3】:

    Baschi's answer 中使用的方式并不总是适合我。好吧,这里有一个完整的解决方案。

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

    【讨论】:

    • 只是一点点评论:与其说 这种方式有时对我不起作用,不如说 [Baschi 提出的解决方案](stackoverflow.com/a/19934089/4453460) 没有'有时对我不起作用(只是为了更清楚)。
    【解决方案4】:

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

    1. 创建目录和/或保存文件后,从(MTP)模式切换到USB(SD卡)模式片刻,等待SD卡挂载到PC上,这样目录和文件将显示。

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

    3. 重新保存文件时,必须再次切换到 USB 才能看到它。

    【讨论】:

      【解决方案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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案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)
                          }
          
                      })
             }
          }
          

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              猜你喜欢
              • 2016-11-24
              • 1970-01-01
              • 2021-10-07
              • 2014-04-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多