我在我们开发的Android应用程序中使用apache commons库。这是遗留代码,由于某种原因,它不是写入设备。这种情况发生在多个设备上,因此它不是特定于设备的。我们正在使用运行Android 4.4的Nexus 7设备。
该例程基本上FTP到我们的服务器并寻找要下载的新图像。 FTP进入服务器是成功的,没有问题。
String listOfFiles = "GE_PT17_image.png,GE_PT18_image.png,GE_PT39_image.png";
String devicePathName = "/mnt/sdcard/company_name/DRMHH/"
status = ftpConnect(args[2], args[0], args[1], 21);
mFTPClient.changeWorkingDirectory(pathname);
FTPFile[] files = mFTPClient.listFiles();
我们基本上查看服务器上目录中的所有图像,然后将它们匹配到所需的图像:
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
;
} else {
///mnt/sdcard/company_name/DRMHH/
if (listOfFiles.toUpperCase().contains(files[i].getName().toUpperCase())) {
File file = new File(devicePathName + File.separator + files[i].getName());
Log.d("FileName", devicePathName + File.separator + files[i].getName());
try {
FileOutputStream fos = new FileOutputStream(file); //NO ERROR or EXCEPTION
boolean weAreOK = mFTPClient.retrieveFile(files[i].getName(), fos); //returns true
fos.flush();
fos.close();
} catch (Exception e) {
Log.d("File Exception", e.toString());
}
}
}
}
在设备上找不到应该下载的文件。返回文件是否成功检索的变量返回true。就像我说的,这是遗留代码已经存在多年,直到现在没有任何问题。有人有主意吗?
答案 0 :(得分:1)
自Android 3.0以来,通过USB连接使用的协议是媒体传输协议(MTP)。 Android通过MTP提供的文件不文件系统上的内容,而是由MediaStore
索引的内容。
您在外部存储上创建的文件最终会被编入索引并添加到MediaStore
。关键词是&#34;最终&#34;。
所以,这意味着三件事:
请在getFD().sync()
之后和FileOutputStream
之前致电flush()
上的close()
。这可确保在继续之前将文件写入磁盘。
在MediaScannerConnection
之后使用scanFile()
和close()
告诉MediaStore
新创建的文件,而不是等待文件自动编入索引将来任意一段时间。
如果您仍然遇到问题,请使用DDMS的文件资源管理器或 adb shell
仔细检查文件是否存在,而不是仅仅依赖于MTP。