在android中添加的文件夹不能通过USB看到

时间:2012-11-22 07:33:48

标签: android filesystems

我正在尝试将图片保存在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获取它,我不希望最终用户必须手动创建文件夹。

我做错了什么?

8 个答案:

答案 0 :(得分:56)

即使这个话题似乎也很旧。我遇到了同样的问题,重新启动Android设备或PC对用户来说并不实用。 :)这个问题是通过使用MTP协议(我讨厌这个协议)。您需要做的是启动可用文件的重新扫描,您可以使用MediaScannerConnection类来执行此操作:

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

// 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 :(得分:5)

这种方式有时对我不起作用。那么这里是完整的解决方案。

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

答案 2 :(得分:3)

唯一对我有用的是:

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

答案 3 :(得分:0)

如果您通过读卡器将文件夹从PC直接添加到SD卡中,当与手机连接时,它将无法在Windows资源管理器中显示,解决方案是使用Android文件管理器程序复制或移动相同的文件夹,然后它将在连接到PC时列在SD卡索引中。

答案 4 :(得分:0)

对我来说很好。

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

            })
   }
}

答案 5 :(得分:0)

以上都不对我有帮助,但这有效: 窍门是不扫描新文件夹,而是在新文件夹中创建一个文件,然后扫描该文件。现在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);
}

答案 6 :(得分:-1)

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

1)在Dir创建和/或文件保存后,Chang从(MTP)模式转换到USB(SD卡)模式片刻,等待SD卡安装到PC,所以Dir&文件将会显示。

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

3)当重新保存文件时,你必须再次更换为USB才能看到它。

答案 7 :(得分:-2)

首先在电脑上创建目录然后将其复制到SD卡/手机存储器。

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

祝你好运,祝你有个美好的一天! :)