提问人:eje211 提问时间:11/22/2012 最后编辑:Peter Mortenseneje211 更新时间:10/9/2020 访问量:33026
在 Android 上添加的文件夹无法通过 USB 显示
Folder added on Android is not visible via USB
问:
我正在尝试将图片保存在 Android 上的子文件夹中。这是我的一些代码:
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
path = new File(path, "SubDirName");
path.mkdirs();
(我试过用图片文件夹代替DCIM。getExternalStorageDirectory
getExternalStoragePublicDirectory
当设备通过 USB 连接时,我添加的任何子文件夹(包括其内容)都不会显示在 Windows 资源管理器中。不过,它确实显示在 Android 文件管理器中。
我尝试在新目录的父目录上广播意图。它没有用。ACTION_MEDIA_MOUNTED
如果我在 Windows 中添加文件,它会显示在 Android 上。如果我通过文件管理器在 Android 上添加文件,它会显示在 Windows 中。如果我以编程方式添加文件,它会显示在 Android 文件管理器中,但不会显示在 Windows 资源管理器中。我需要从 Windows 获取它,我不希望最终用户必须手动创建文件夹。
我做错了什么?
答:
如果通过读卡器将文件夹从 PC 直接添加到卡的 SD 卡中,则与手机连接时不会显示在 Windows 资源管理器中。
解决方案是使用Android文件管理器程序复制或移动相同的文件夹,然后在连接到PC时将其列在SD卡索引中。
我遇到了同样的问题,重新启动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);
评论
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);
评论
我已经通过切换手机设置解决了这个问题:
创建目录和/或保存文件后,暂时从(MTP)模式更改为USB(SD卡)模式,等待SD卡安装在PC上,以便显示目录和文件。
再次返回 (MTP) 模式,最后一个文件仍显示。
重新保存文件时,您必须再次更改为 USB 才能看到它。
唯一对我有用的是:
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
只需先在PC上创建目录,然后将其复制到SD卡/手机存储中即可。
您可以先将内容放入文件夹中并复制,也可以先将文件夹放入文件夹。只要从PC创建文件夹,任何内容都可以直接复制到内部/外部移动设备。对于压缩的内容,不幸的是,它不能直接解压缩和复制;您需要先解压缩它们。
这对我来说很好。
如果目录(不是目录)中有文件,则 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)
}
})
}
}
以上都没有帮助我,但这奏效了: 诀窍是不要扫描新文件夹,而是在新文件夹中创建一个文件,然后扫描该文件。现在,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);
}
评论