Xamarin Android 16 Jelly Bean / 4.1 创建文件夹和文件

Xamarin Android 16 Jelly Bean / 4.1 create folder and file

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

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

我正在实际设备上使用 usb 调试测试设备,即使它是 4.1,代码 运行s 和功能工作 - 相机,扫描仪等

我无法尝试创建一个文件夹,然后 write/read 该文件夹中的一个文件。我希望在插入计算机时可以通过 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 的 运行 时间为空。

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

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

的符号链接

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

您还可以下载一个文件浏览器应用程序(如果您的 phone 还没有)并转到“文档”文件夹。你应该在那里看到 FolderName


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

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