【问题标题】:Xamarin Android 16 Jelly Bean / 4.1 create folder and fileXamarin Android 16 Jelly Bean / 4.1 创建文件夹和文件
【发布时间】:2020-03-15 21:05:33
【问题描述】:

我知道 C#;已为 windows mobile 开发;我现在有一个无法更改约束的 android 项目;最重要的是无法在 API 16 以上运行,因为应用程序将在其上运行。这些设备已经购买。我知道这些设备的年代,以及 4.1 的年代;双手被绑。

我已经开始了一个新的 Xamarin(不是表单)项目,仅适用于 android;使用 8.1 Oreo 编译;最低版本 4.1,目标版本 8.1。我知道这并不理想,但是这样做我已经设法使许多其他需要的功能正常工作,包括相机和条形码扫描仪。将编译版本更改为 4.1 会导致许多无法编译的错误。

我正在实际设备上使用 USB 调试来测试设备,即使它是 4.1,代码运行并且功能正常 - 相机、扫描仪等。

我一直在尝试创建一个文件夹,然后在该文件夹中写入/读取一个文件。我希望在插入计算机时可以通过 Windows 资源管理器访问此文件夹。

我有这样的代码来写一个文件:

string FileContents = "Text file contents";

Java.IO.File SaveFolder = new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory("Documents") + Java.IO.File.Separator + "FolderName");

Boolean Success = false;
if (!SaveFolder.Exists())
{
    Success = SaveFolder.Mkdirs();
}

string FName = "test.txt";
string FTogether = System.IO.Path.Combine(SaveFolder.Path, FName);

Java.IO.FileWriter fw = new Java.IO.FileWriter(FTogether);
fw.Write(FileContents);
fw.Close();
SaveFolder.Dispose();

读取文件的代码如下:

Java.IO.File SaveFolder = new Java.IO.File(Android.OS.Environment.GetExternalStoragePublicDirectory("Documents") + Java.IO.File.Separator + "FolderName");

string FName = "test.txt";
string FTogether = System.IO.Path.Combine(SaveFolder.Path, FName);

StreamReader sr = new StreamReader(FTogether);
string FileContents = sr.ReadToEnd(); 

调试显示 SaveFolder 的 AbsolutePath 为 /storage/sdcard0/Documents/FolderName

我认为这是应用程序可以访问的 android 内部存储的一部分,但没有别的。

如何获取可从应用程序外部访问的文件夹?

Environment.DirectoryDocuments 

无法使用,因为它在 API 16 上运行时为空。

【问题讨论】:

标签: c# android xamarin android-4.1-jelly-bean


【解决方案1】:

您拥有的路径实际上是可公开访问的,因此它并不特定于您的应用程序。当您将 Android 设备连接到计算机时,您应该能够转到设备的根文件夹并看到 Documents 文件夹。

不要让路径开头的/storage/sdcard0/ 部分让您感到困惑。由于历史原因,即使设备上实际上没有 SD 卡,Android 也会模拟一张 SD 卡。实际上,/storage/sdcard0/ 只是指向/data/media/0 的符号链接。

要真正了解 Android 存储,我建议您阅读这篇非常详尽的 Reddit 帖子:Let's clear up the confusion regarding storage in Android once and for all, including adoptable storage in Marshmallow.

您还可以下载一个文件浏览器应用程序(如果您的手机还没有),然后转到 Documents 文件夹。你应该在那里看到FolderName


编辑:由于您使用的是这么旧的版本,因此您可能还会遇到 MTP 协议中的错误,这会导致新创建的文件和文件夹在将设备连接到时不可见通过 USB 连接的计算机。

解决方法是为您创建的每个新文件/文件夹调用MediaScannerConnection.scanFile,如here 所述。

【讨论】:

  • 感谢reddit链接;和 MTP 问题肯定在这里发挥作用,而我之前并没有意识到这一点。仍然找不到文件夹,但使用 GetExternalFilesDir(string.Empty).Path 它解析为 android\data[project name]\files - 我可以从资源管理器中看到...在完成 MTP 之后
  • 很高兴听到它现在可以工作。前段时间我还必须处理一个 4.x 项目,与最新的操作系统版本相比,所有这些晦涩难懂的错误/功能确实减慢了进度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 2017-05-23
相关资源
最近更新 更多