除非我“强制关闭”应用程序,否则在 Windows 中看不到由 Android 应用程序在 SD 卡上写入的文件
Posted
技术标签:
【中文标题】除非我“强制关闭”应用程序,否则在 Windows 中看不到由 Android 应用程序在 SD 卡上写入的文件【英文标题】:Can't see a file in Windows written by an Android app on SD card unless I "Force Close" the app 【发布时间】:2011-11-17 17:59:12 【问题描述】:我通过我的 android 程序编写了一个文件,如下所示:
String file = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Files/hello.txt";
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(str + "\n"); \\ Yeah, 'str' has a value there
writer.close();
程序完成它的工作并完成。现在我点击 Android 上的后退按钮关闭应用程序。如果我然后转到 Android 文件浏览器(如 Astro),我可以看到该文件,但如果我在 Windows 上安装 SD 卡,我看不到该文件!
现在,如果我转到 设置 → 应用程序 → 管理应用程序 → “强制停止”,我什至可以在 Windows 中看到该文件。
如果文件是由我的 Android 应用程序在 SD 卡上写入的文件,我应该怎么做才能在 Windows 中看到该文件,并且我不想每次都去设置并强制关闭。
实际上文件正在正确写入(我认为),但是由于 Android '后退'按钮的默认行为不会杀死应用程序,而且看起来除非应用程序被杀死,否则我无法在外面打开文件Android(在 Android 中,我仍然可以看到它,甚至可以打开它)。
那么,对于这种情况,最好的解决方案是什么?我应该在关闭时自动终止应用程序吗?人们说 System.exit() 是绝对不推荐的。
【问题讨论】:
我也有同样的问题。自从您提出问题后,您是否能够解决它? 【参考方案1】:您必须使用以下代码,以便您的存档显示在 Windows 的文件系统或手机的图库中。
你有两种可能:
它更快,因为 Android 只更新传递的文件:
MediaScannerConnection.scanFile(this, new String[]"your path here</", null, null);
它更昂贵,因为 Android 将搜索传递路径中的所有文件。您可以只传递文件夹的路径以减少对文件的搜索:
context.sendBroadcast(
new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + "path of the folder")));
【讨论】:
这确实应该得到更多的投票 - 一个可能是常见问题的好解决方案。 谢谢。我希望这个解决方案可以帮助到很多开发者。 不幸的是 sendBroadcast 方式不再适用于 Kitkat Android 4.4。 :( 我有同样的问题,我用我的应用程序将文本文件保存到我的 sd 卡中,当我更改管理文件中的文件名时,Window explorer 看不到它们平板电脑,文件出现在 Windows 资源管理器中...我不知道为什么会这样 @ThomasTrabelsi 我会检查这个问题,我会回复你一个可能的修复。【参考方案2】:因为BufferedWriter对象是一个缓冲区,所以需要flush()缓冲区来强制将内容写入输出流。
String file = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Files/hello.txt";
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(str+"\n");
writer.flush(); // force the buffer to actually dump its data to the stream
writer.close();
当您使用缓冲区 .write() 时,请始终记住,数据将保存在缓冲区中,直到缓冲区被填充(然后自动刷新()ed),或者您强制缓冲区使用缓冲区的 .flush() 方法。
此外,在您强制关闭应用程序之前无法正确写入文件的原因是,当您终止应用程序时,所采取的步骤之一是 flush() 与该应用程序关联的所有缓冲区。这就是为什么只有在你强行杀死它时才会发生这种情况。
注意:请记住,这是许多不同语言中大多数缓冲流的默认行为。
【讨论】:
.close()
自动调用.flush()
【参考方案3】:
通过 USB 连接时,Windows 7 在查看文件时确实存在问题。我的解决方法是使用 GNU/Linux 发行版。
使用终端应用程序,root:root
文件在资源管理器中可见,但其他所有者不可见。
【讨论】:
你能解释一下你的解决方案的比赛吗?以上是关于除非我“强制关闭”应用程序,否则在 Windows 中看不到由 Android 应用程序在 SD 卡上写入的文件的主要内容,如果未能解决你的问题,请参考以下文章
除非Windows Activation Service (WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。