我正在尝试将图片保存在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获取它,我不希望最终用户必须手动创建文件夹。
我做错了什么?
答案 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);
答案 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创建的,任何内容都可以直接复制到内部/外部移动设备。对于压缩内容,不能直接解压缩和复制,不幸的是,您需要先将它们解压缩。
祝你好运,祝你有个美好的一天! :)